我们在设计数据表时,使用自动增长字段可以简化子弹数据的生成,在开发实践中,经常将主键设置为自动增长字段,不同的数据库自动增长字段实现是不同的,下面我们来一起详细了解下
首先了解下怎么在MySQL中创建自增字段,在MySQL中创建自增字段,在MySQL中创建自增字段比较简单,只需要在字段后面加上auto_increment 即可:
create table t_test(id int primary key auto_increment,name varchar(20))
上面例句创建了测试表t_test,表中字段id 被设置为自动增长的主键,它的默认初始值1且步长为1。使用下面的语句向t_test表中插入大数据:
insert into t_test (name) values ('a');
insert into t_test (name) values ('b');
通过查询语句查询插入后的数据:
select * from t_test;
结果集:
从结果可以看出,虽然上面insert语句没有向主键id字段插入数据,但是数据库自动向id字段插入数据,数据初始值为1,步长为1的值。
如果希望自己来设定表的自增字段初始值,可以用下面的SQL来完成:
ALTER TABLE t_test AUTO_INCREMENT = 5;
例句中的5是自己设置的,而且需要大于自增字段id的当前最大值2,如果小于则无效。执行上面SQL后,当再次向表中新增数据时:
insert into t_test (name) values ('c');
select * from t_test
结果集:
id的值从5开始自增。如果希望修改自增步长,MySQL数据库还提供了系统参数auto_increment_increment来控制自增步长,以方便进行个性化的设置。现在我们执行下面的sql语句:
SET session auto_increment_increment =2;
insert into t_test(name)values ('d');
select * from t_test;
上面SQL语句中的SET session auto_increment_increment =2是将本会话中的自增长步长修改为2,然后向表中新增一条记录,从执行结果来看,表t_test的id从5增到了7,说明步长变成了2.
结果集:
在SQLServer中为一个字段设置自动增长也比较简单,只需要指定字段为IDENTITY即可,比如我们在SQLServer中创建t_test表:
create table t_test(int id PRIMARY KEY IDENTITY(1.1),name nvarchar(20));
在建表语句中IDENTITY(1,1)中的第一个参数值1表示初始值1,第二个参数值1代表步长是1,新增两条记录:
insert into t_test(name) values('a');
insert into t_test(name) values('b');
结果集:
和MySQL的效果一样。id字段按照初始值为1和步长为1的规则自动填充数据。SQLServer提供了修改自增字段初始值的方法:
DBCC CHECKOUT('t_test',RESEED.10)
语句中参数10是设置值,该值必须大于自增字段的最大值,否则记录时会报出Id重复的错误提示。
上面我们说了如何在MySQL和SQLServer中使用自增字段,还是比较简单的,但是在Oracle中使用自增字段就稍微有点麻烦了,由于没有像MySQL那样的auto_increment的属性标识,所以需要手工创建序列sequence,首先创建一张表:
create table t_test(id number,name varchar2(20))
并为该表创建一个对应的序列:
create sequence t_test_id_seq
increment by 1
start with 1
nomaxvalue
nominvalue
nocache
create OR replace trigger tr_t_test
before insert on t_test
for each row
begin
select t_test_id_seq.nextval into :new .id from dual;
end;
进行上面的设置后,在使用insert语句向表的t_test新增数据后,id字段就会自动填充数据。
在Oracle中可以通过下面SQL修改序列的步长:
alter sequence t_test_id_seq increment by 5
但要修改序列初始值就没有这么简单了,需要通过修改步长来解决,若序列t_test_id_seq 现值是2,需要设置初始值为100,Increment by值为98(100-2)
alter sequence t_test_id_seq increment by 98;
select t_test_id_seq.nextval from dual;
alter sequence t_test_id_seq increment by 1;
上面的SQL语句中的alter sequence t_test_id_seq increment by 98将自增步长修改为98;
第二条语句执行select t_test_id_seq.nextval from dual做一次查询,使初始值增加到100(98+2),最后在自增步长修改回1、这样序列就可以以100为初始值、以自增步长为1进行增长了
MySQL,SQLServer,Oracle三种数据库以各自独有的方式实现了自增字段的设置,其中MySQL、SQLServer是给列设置属性实现字段的自增,Oracle是通过创建序列并绑定字段来实现字段自增的,虽然有些复杂,但是也很灵活,可以根据具体需求配置自增初始值和步长。
尽管自增字段给我们带来了很多方便,比如自增字段为数据库自动生成值、性能较高。由于该字段为数值型,占用空间小,容易创建索引和排序等。
但是自动字段的使用也存在一些缺点,比如当我们准备手动插入特定ID(非数据库自动生成)就比较麻烦,特别是两张表合并成一个表时,ID之间的重复值处理就显得更不方便。所以项目中需要结合实际场景综合考虑使用自增字段,虽然在大部分的场合还是建议使用的。