SQL学习笔记----第二天(学生信息表自增字段的使用)

学生信息表自增字段的使用--目录

  • 前言
  • 一、MySQL中使用自增字段
  • 二、SqlServer中使用自增字段
  • 三、Oracle中使用自增字段
  • 总结

前言

我们在设计数据表时,使用自动增长字段可以简化子弹数据的生成,在开发实践中,经常将主键设置为自动增长字段,不同的数据库自动增长字段实现是不同的,下面我们来一起详细了解下


一、MySQL中使用自增字段

首先了解下怎么在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.
结果集:
SQL学习笔记----第二天(学生信息表自增字段的使用)_第1张图片

二、SqlServer中使用自增字段

在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重复的错误提示。

三、Oracle中使用自增字段

上面我们说了如何在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
	 
  • increment by:指定了自增步长为1.
  • start with:指定了初始值为1.
  • Maxvalue: 用于指定序列生成器可以生成最大序列号(必须大于或等于start with,并且必须大于minvalue),默认为 no maxvalue
  • Minvalue:用于指定序列生成器可以生成的最小序列号(必须小于或等于start with,并且小于maxvalue),默认值为:nominvalue
  • Cache:用于指定在内存中可以预分配的序列号个数(默认值是20),设置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之间的重复值处理就显得更不方便。所以项目中需要结合实际场景综合考虑使用自增字段,虽然在大部分的场合还是建议使用的。

你可能感兴趣的:(sql学习,sql,数据库,mysql)