id主键自增长那些事

来源:互联网 发布:亲爱的你可知网络歌手 编辑:程序博客网 时间:2024/05/22 06:16
create sequence seq_id start with 1;

很多id 爱好者 喜欢在新建数据库表时,先添加id number字段,为了方便插入数据,尤喜欢将id设为自增字段。
那么几天在前辈的经验之上总结一下那些能使字段自增的方法
  一、Sequence
      Sequence是数据库系统按照一定规则自动增加的数字序列。我们一般将此序列看做代理主键。要使用它的筒靴们要注意它所存在的数据库有:Oracle、DB2、PostgreSQL。
      而很多人熟悉的MySQL、SQL Server则没有此序列。
      以Oracle内的Sequence为例说明其使用方法:
     1.定义Sequence 
      定义一个seq_test,最小值为100000 ,最大值为600000,从101000开始,增量为1,缓存为20的循环排序Sequence
     
 create sequence seq_test       minvalue 100000      maxvalue 600000      start with 101000      increment by 1      catch 20      cycle      order;


     
     2.Sequence使用
       Oracle等数据库Sequence的引用参数为currval、nextval,分别表示当前id和下一个id
     select seq_test.nextval from dual;表示查询下一个id值
     这样若有表User,字段有id(number)、username(varchar)、age(number),当保存新数据时 可以SQL这样写:

     

insert into User(id,username,age)values(seq_test.nextval,'qiyue',23); 

       看得出序列是独立于表的存在。

     

     当然,如果你的id没有限制的话,可以这样写

create sequence seq_id start with 1;


  二、indetity
      indetity可以被定义为指定的自增属性,即只在其所在表有效,是依附于表的存在。
      
      1. DB2
         生成列和标识列
        generated by default as identity
        generated always as identity
       两种不同的的定义方式,从字面意思可看出第一种在插入数据时允许手工指定自增字段的值,只要不重复,数据库会在下次存放数据时自动设置下一个值
       第二种则只能由数据库自动分配并插入。
        举例说明:
       
create table User(id int generated by default as identity,username char)

      当指定插入default时,id为自增,从1开始

  create table User(id int generated always as identity ,username char )

     

     这种方式只能指定插入default,如果指定id的值将会出错

      
      2. MYSQL
       
create table table1(id int auto_increment primary key,username char(30));

        默认id从1开始自增
        如果你已建表且主键未自增,删除主键,使用添加语句使表自增:

       
alter table table2 add id int auto_increment primary key;

            一定要设置为主键,当前最大值当然是max(id)。

        插入数据的时候不需对自增字段设值,如

    

  insert into table1(username)values('qiyue');

      
      3. SQLServer
     
   create table testtable1(id int IDENTITY,department varchar(12) )        select * from testtable1        insert into testtable1 values('设计')        insert into testtable1 values('市场')        insert into testtable1 values('售后')         /*结果          id department          1 设计          2 市场          3 售后          */

        如果你要新建的表id有初始值 则表示为:id int identity(初始值,增量);