精华内容
下载资源
问答
  • Navicat Navicat中怎么设置主键自增长

    Navicat  Navicat   中怎么设置主键自增长? mysql

    点击设计表,然后

    出现如下菜单

    展开全文
  • mysql 主键自增长

    2013-05-06 16:52:57
    mysql数据库表主键自增长的sql语句 1、不控制主键的起点 create table emb_t_dictBusType ( emb_c_busTypeID int not null auto_increment, emb_c_busTypeEnName varchar(255) not null, emb_c_busTypeZhName ...
    mysql
    数据库
    表主键自增长的sql语句
    
    1、不控制主键的起点
    create table emb_t_dictBusType
    (
       emb_c_busTypeID      int not null auto_increment,
       emb_c_busTypeEnName  varchar(255) not null,
       emb_c_busTypeZhName  varchar(255) not null,
       primary key(emb_c_busTypeID)  
    )engine=INNODB  default charset=gbk;


    2、控制主键的起点
    create table emb_t_dictBusType
    (
       emb_c_busTypeID      int not null auto_increment,
       emb_c_busTypeEnName  varchar(255) not null,
       emb_c_busTypeZhName  varchar(255) not null,
       primary key(emb_c_busTypeID)  
    )engine=INNODB auto_increment=1001 default charset=gbk;


    展开全文
  • Mysql 主键自增长

    2017-08-16 16:52:12
    alter table userinfo modify id integer auto_increment ;
    alter table userinfo modify id integer auto_increment ;  
    
    展开全文
  • PowerDesigner设置MYSQL主键自动增长的方法.pdf
  • Mysql 主键自增长问题小结

    千次阅读 2015-07-30 23:53:54
    Mysql 主键自增长问题小结 http://blog.csdn.net/summerhust/article/details/7914098 在mysql中,主键有auto_increment来保证其自增长,如果我们自定义函数来表示auto_increment的话可以如下: Sql代码  ...

    Mysql 主键自增长问题小结

    • http://blog.csdn.net/summerhust/article/details/7914098

    在mysql中,主键有auto_increment来保证其自增长,如果我们自定义函数来表示auto_increment的话可以如下:

    Sql代码  复制代码  收藏代码
    1. create function select_autoincrement_id() returns int(11)
    2. begin
    3. select max(id)+1 from table_name;
    4. end
    [sql]  view plain copy
    1. create function select_autoincrement_id() returns int(11)  
    2. begin  
    3. select max(id)+1 from table_name;  
    4. end  

    但是,此方法会有并发方面的问题,如两个事务中就可能获取到同一个id而其中一个失败,所以需要锁表

    Sql代码  复制代码  收藏代码
    1. create function select_autoincrement_id() returns int(11)
    2. begin
    3. select max(id)+1 from table_name for update;
    4. end
    [sql]  view plain copy
    1. create function select_autoincrement_id() returns int(11)  
    2. begin  
    3. select max(id)+1 from table_name for update;  
    4. end  

    用此种方法的话可以实现一些复杂的自增长逻辑要求,比如在一个复合主键中,要求以其中一个主键为参照物,另一个主键重新从1开始自增长,但缺点是需要锁表,在大并发环境中会影响一定的效率,在mysql 5.1.22版本之前,均是需要锁表的,但在5.1.22版本之后,引入了一种新的方法来解决自增长的效率问题,

    Sql代码  复制代码  收藏代码
    1. innodb_autoinc_lock_mode = 0(全部使用表锁)
    2. innodb_autoinc_lock_mode = 1(默认,可预判行数时使用新方式,不可时使用表锁)
    3. innodb_autoinc_lock_mode = 2(全部使用新方式)
    [sql]  view plain copy
    1. innodb_autoinc_lock_mode = 0(全部使用表锁)  
    2. innodb_autoinc_lock_mode = 1(默认,可预判行数时使用新方式,不可时使用表锁)  
    3. innodb_autoinc_lock_mode = 2(全部使用新方式)  
    在级别1中,引入了一个轻量级的互斥量,在不同的事务中auto_increment总是可以获取到最新的自增长主键值而不需要锁表(感觉似乎有点违背mysql默认的事务隔离级别?),但对于无法提前获知插入行数的sql依然需要锁表,如insert...select... replace...select... load data 还是使用表锁




     

    Mysql 中获取刚插入的自增长id的值

    Sql代码  复制代码  收藏代码
    1. insert into user (username,passwordVALUES ('zyl','123');   
    2. select last_insert_id();   
    3. 获取刚插入的自增长id的值  
    [sql]  view plain copy
    1. insert into user (username,passwordVALUES ('zyl','123');  
    2. select last_insert_id();  
    3. 获取刚插入的自增长id的值  



    Java代码  复制代码  收藏代码
    1.   
    2.   
    3.   
    4.   
    5.   
    6.   
    7.   
    8.   
    9.   
    10.   
    11.   
    12. 在MySQL中,使用auto_increment类型的id字段作为表的主键,并用它作为其他表的外键,形成“主从表结构”,这是数据库设计中常见的用法。但是在具体生成id的时候,我们的操作顺序一般是:先在主表中插入记录,然后获得自动生成的id,以它为基础插入从表的记录。这里面有个困难,就是插入主表记录后,如何获得它对应的id。通常的做法,是通过“select max(id) from tablename”的做法,但是显然这种做法需要考虑并发的情况,需要在事务中对主表加以“X锁“,待获得max(id)的值以后,再解锁。这种做法需要的步骤比较多,有些麻烦,而且并发性也不好。有没有更简单的做法呢?答案之一是通过select LAST_INSERT_ID()这个操作。乍一看,它和select max(id)很象,但实际上它是线程安全的。也就是说它是具体于数据库连接的。下面通过实验说明:   
    13.   
    14.   1、在连接1中向A表插入一条记录,A表包含一个auto_increment类型的字段。   
    15.   
    16.   2、在连接2中向A表再插入一条记录。   
    17.   
    18.   3、结果:在连接1中执行select LAST_INSERT_ID()得到的结果和连接2中执行select LAST_INSERT_ID()的结果是不同的;而在两个连接中执行select max(id)的结果是相同的。   
    19.   
    20.   其实在MSSQL中SCOPE_IDENTITY()和IDENT_CURRENT()的区别和这里是类似的。使用SCOPE_IDENTITY()可以获得插入某个IDENTITY字段的当前会话的值,而使用IDENT_CURRENT()会获得在某个IDENTITY字段上插入的最大值,而不区分不同的会话。   
    21.   
    22.   注:使用select last_insert_id()时要注意,当一次插入多条记录时,只是获得第一次插入的id值,务必注意!可以试试   
    23.   
    24.   insert into tb(c1,c2) values (c1value,c2value),(c1value1,c2value2)..。   
    25.   
    26.     
    27.   
    28. 最后有个问题一直没解决:   
    29.   
    30. 使用select last_insert_id()时要注意,当一次插入多条记录时,只是获得第一次插入的id值,务必注意。   
    31.   
    32.   
    33.   
    34.   
    35.   
    36.   
    37.   
    38.   
    39.   
    40.   
    41.   
    42.   
    43.   
    44.   
    45.   
    46.   
    47.   
    48.   
    49.   
    50.   
    51.   
    52. 我们在写数据库程序的时候,经常会需要获取某个表中的最大序号数,   
    53.   
    54. 一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的。   
    55. 但在多线程情况下,就不行了。   
    56.   
    57. 下面介绍三种方法   
    58.   
    59. (1) getGeneratedKeys()方法:   
    60.   
    61. 程序片断:   
    62.     Connection conn = ;   
    63.             Serializable ret = null;   
    64.             PreparedStatement state = .;   
    65.             ResultSet rs=null;   
    66.             try {   
    67.                 state.executeUpdate();   
    68.                 rs = state.getGeneratedKeys();   
    69.                 if (rs.next()) {   
    70.                     ret = (Serializable) rs.getObject(1);   
    71.                 }         
    72.             } catch (SQLException e) {   
    73.             }   
    74.             return ret;   
    75.   
    76. (2)LAST_INSERT_ID:   
    77.   
    78. LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变。   
    79.   
    80. 在多用户交替插入数据的情况下max(id)显然不能用。   
    81. 这就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update*作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。使用单INSERT语句插入多条记录,  LAST_INSERT_ID返回一个列表。   
    82.   
    83. (3)select @@IDENTITY:   
    84. 显示代码   
    85. 打印   
    86.     String sql="select @@IDENTITY";   
    87.   
    88. @@identity是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。一般系统定义的全局变量都是以@@开头,用户自定义变量以@开头。比如有个表A,它的自增列是id,当向A表插入一行数据后,如果插入数据后自增列的值自动增加至101,则通过select @@identity得到的值就是101。使用@@identity的前提是在进行insert操作后,执行select @@identity的时候连接没有关闭,否则得到的将是NULL值。


    利用mysql事务特性实现并发安全的自增ID示例

    项目中经常会用到自增id,比如uid,下面为大家介绍下利用mysql事务特性实现并发安全的自增ID,感兴趣的朋友可以参考下
    项目中经常会用到自增id,比如uid,最简单的方法就是用直接用数据库提供的AUTO_INCREMENT,但是如果用户量非常大,几千万,几亿然后需要分表存储的时候呢,这种方案就搞不定了,所以最好有一个全局的自增ID的生成器,不管是否分表,都能从生成器中获取到全局自增的ID。 

    实现方法应该有很多,不过所有的方案都需要解决一个问题,就是保证在高并发的情景下,数据获取依然正确,每次获取的ID都不会重复。 

    这里我分享两种利用mysql的innodb的事务特性来实现的方案,一种是实现过了的,另一种没有试验过,不过应该也能走的通。 

    先介绍第一种,在数据库中单独设置一张表,来存储ID,表有两个字段,一个是种类吧,一个就是ID: 
    复制代码代码如下:

    CREATE TABLE auto_id( 
    idname varchar(20) NOT NULL DEFAULT '', 
    id bigint(20) NOT NULL DEFAULT 0 COMMENT '', 
    primary key(idname) 
    )ENGINE=Innodb DEFAULT CHARSET=utf8; 

    接下来是一个存储过程: 
    复制代码代码如下:

    delimiter // 
    drop procedure if exists get_increment_id; 
    create procedure get_increment_id(in idname_in varchar(20), in small_in bigint, out id_out bigint) 
    begin 
    declare oldid bigint; 
    start transaction; 
    select id into oldid from maibo_auto_id where idname=idname_in for update; 
    if oldid is NULL then 
    insert into maibo_auto_id(idname,id) value(idname_in, small_in); 
    set id_out=small_in; 
    else 
    update maibo_auto_id set id=id+1 where idname=idname_in; 
    set id_out=oldid+1; 
    end if; 
    commit; 
    end; 
    // 

    重点是这句,select id into oldid from maibo_auto_id where idname=idname_in for update,会给相关数据加一个独占锁定,这时候别的进程如果来读取该条记录,就会进入等待,等待这个进程commit之后,再继续,这样就保证了在并发的情况下,不同的进程不会取到相同的值。 

    如果你的前端是用php实现的。 

    只需执行如下两个sql,就可以获取到,这个small参数是定义的是从多少开始自增 
    复制代码代码如下:

    $sql = "call get_increment_id('{$key}', {$small}, @id)"; 
    $ret = $db->getData("select @id"); 


    还有另外一种方法,就是利用mysql的auto_increment。 

    先创建一张表,表里边只有一个自增字段: 
    复制代码代码如下:

    create table test( 
    `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id', 
    primary key (id) 
    )ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

    通过如下两条sql: 
    复制代码代码如下:

    UPDATE test SET id = LAST_INSERT_ID(id + 1); 
    SELECT LAST_INSERT_ID(); 

    也能解决问题, LAST_INSERT_ID是不用查表的,而且只针对当前连接,也就是说别的连接的更新不会影响到当前连接的取值。 

    这样可能每个ID都得弄一张表来维护,这也是缺点。 

    具体使用中如何处理,就看自己的选择了。

    展开全文
  • Mybatis+mysql主键自增长,插入语句返回主键id #(一)SQL语句获取主键自增长的id <insert id="addGoods" parameterType="com.wlmall.shop.domain.Goods"> <-/ 通过此语句...
  • mysql主键设置自动增长,删除几条记录后,新增的主键不是现在主键的下一个,而是所有记录中的下一个,求怎样获取下一个主键值
  • PowerDesigner 设置mysql 主键自增长,见图标识步骤:  
  • 设置了mysql主键自动增长,但因为删除字段的操作导致主键不连续 解决方法 step1:在mapper.xml文件中添加update标签设置自动增长的增量为1 alter table student AUTO_INCREMENT=1; <!--StudentMapper.xml文件--&...
  • PowerDesigner 15设置mysql主键自动增长及基数 1、双击标示图,打开table properties->columns, 如图点击图标Customize Columns and Filter(或直接用快捷键Ctrl+U) 2、选中identity 3、 设置基数,点击physical...
  • 如何在PowerDesigner设置MYSQL主键自动增长的方法,打开PDM,选中一张表,双击打开表属性,选择Columns列,选中主键字段,双击打开,界面的最下方右下角有一个Identity,选中这个之后,生成的表主键就是自动增长的了...
  • MySql 主键自动增长 博客分类: DataBase MySQLSQL  创建数据库,创建表。 Sql代码 mysql> create database ssh2; Query OK, 1 row affected (0.04 sec) mysql> use ssh2; ...
  • MySql 主键自增重置器 resetAutoincrement 是一款基于 Java 开发的程序,其功能为重置 mysql 主键自增的值为最近的一个。 介绍 开发背景主要是工作中,测试同学在清理数据的时候,使用的是 DELETE 进行删库(其实...
  • MySql数据库表主键自增长的sql语句 1、不控制主键的起点 createtable emb_t_dictBusType (  emb_c_busTypeID int not null auto_increment,  emb_c_busTypeEnName varchar(255) not null,  emb_c_...
  • 查看配置 show variables like '%increment%'; 如果: auto_increment_increment=2 执行 set @@global.auto_increment_increment = 1; set @@auto_increment_increment =1; ...set @@global.auto_increment_offset =1;...
  • alter table 表名 AUTO_INCREMENT=1387;
  • mysql 主键自动增长问题

    千次阅读 2015-11-24 14:56:04
    由Hibernate根据数据库表自动生成的"类名.hbm.xml"映射文件引起的。 很关键的一点 --------------------------------------------...主键由外部程序负责生成,在 save() 之前指定一个。 “hilo” 通过hi/lo 算法实现
  • mysql 主键自增长并且设置默认值

    千次阅读 2015-01-13 22:54:18
    CREATE TABLE `ecm_address` ( ...你注意这段创建表的mysql语句,在最后一行有个:AUTO_INCREMENT=2,这个表示建好表之后,自动增长是从2开始的,如果=10,那么是从10开始的。明白了吧,有用的话请给分,谢谢!
  • 主要介绍了mysql主键自增长用法,结合实例形式分析了MySQL主键自增长的基本设置、使用方法与操作注意事项,需要的朋友可以参考下
  • mysql主键自增长

    2013-05-10 13:40:14
    在网上查过一些资料,很多人说,mysql中,只有主键才能设置为自增长列。 经过一些深入的了解,其实并非只有主键才能设自增长,而是设为“键(key)”的列就可以设置自增长。   下面通过几个例子来具体说明一下: ...
  • mysql设置主键自动增长

    万次阅读 2018-11-09 21:56:19
    Mysql中可以通过字段的auto_increment属性来自动增长。 1.不设置主键增长起点(默认1开始) create table user1(usernc varchar(10) not null, userid int not null auto_increment, username int not ...
  • mysql 不是主键自增长

    千次阅读 2017-08-08 18:01:50
    在网上查过一些资料,很多人说,MySQL中,只有主键才能设置为自增长列。 经过一些深入的了解,其实并非只有主键才能设自增长,而是设为“键(key)”的列就可以设置自增长。   下面通过几个例子来具体说明...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 49,758
精华内容 19,903
关键字:

mysql主键自增长

mysql 订阅