[笔记]流行数据库SQL差异分析之“自动增长字段”
自动增长字段
在设计数据库的时候,有时需要表的某个字段是自动增长的,最常使用自动增长字段的就是表的主键,使用自动增长字段可以简化主键的生成。不同的DBMS中自动增长字段的实现机制也有不同。
MYSQL
MYSQL中设定一个字段为自动增长字段非常简单,只要在表定义中折定字段为AUTO_INCREMENT即可。比如下面的SQL语句创建Person表,其中主键Fid为自动
增长字段:
CREATE TABLE T_Person
(
FId INT PRIMARY KEY AUTO_INCREMENT,
FName VARCHAR(20),
FAge INT
);
插入数据:语句没有为Fld字段设定任何值,因为DBMS会自动为Fld字段设定值。
INSERT INTO T_Person(FName,FAge)VALUES('Tom',18);
INSERT INTO T_Person(FName,FAge)VALUES('Jim',81);
INSERT INTO T_Person(FName,FAge)VALUES('Kerry',33);
SQLServer
SQLServer中设定一个字段为自动增长字段只要在表定义中指定字段为IDENTITY即可,格式为:IDENTITY(startvalue,step),其中的startvalue参数值为起始数字,step参数值为步长,即每次自动增长时增加的值。
CREATE TABLE T_Person
(
FId INT PRIMARY KEY IDENTITY(100,3), //100,103,106...
FName VARCHAR(20),
FAge INT
);
Oracle
Oracle中不像MYSQL和SQLServer中那样指定一个列为自动增长列的方式,不过在Oracle中可以通过SEQUENCE序列来实现自动增长字段。在Oracle中SEQUENCE被称为序列,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。
在使用SEQUENCE前需要首先定义一个SEQUENCE,定义SEQUENCE的语法如下:
CREATE SEQUENCE seq_PersonId
INCREMENT BY 1
START WITH 1;
其中seq_PersonId为序列的名字,每个序列都必须有唯一的名字,STARTWITH 1为起始数字,INCREMENT BY 1参数值为步长,即每次自动增长时增加的值。
一旦定义了SEQUENCE,就可以用CURRVAL来取得SEQUENCE的当前值,也可以通过NEXTVAL来增加SEQUENCE,然后返回新的SEQUENCE值。比如:
sequence_name.CURRVAL
sequence_name.NEXTVAL
如果SEQUENCE不需要的话就可以将其删除:DROP SEQUENCEseq_PersonId
例子:
CREATE TABLE T_Person
(
FId NUMBER (10) PRIMARY KEY,
FName VARCHAR2(20),
FAge NUMBER (10)
);
INSERT INTOT_Person(FId,FName,FAge) VALUES(seq_PersonId.NEXTVAL,'Tom',18);
INSERT INTO T_Person(FId,FName,FAge)VALUES(seq_PersonId.NEXTVAL,'Jim',81);
使用SEQUENCE实现自动增长字段的缺点是每次向表中插入记录的时候都要显式的到SEQUENCE中取得新的字段值,如果忘记了就会造成错误。为了解决这个问题,我们可以使用触发器来解决,创建一个T Person表上的触发器:
CREATE OR REPLACE TRIGGER trigger_personIdAutoInc
BEFORE INSERT ON T_Person
FOR EACH ROW
DECLARE
BEGIN
SELECT seq_PersonId.NEXTVAL INTO:NEW.FID FROM DUAL;
END trigger_personIdAutoInc;
INSERT INTO T_Person(FAge) VALUES('Wow',22);
INSERT INTO T_Person(FName,FAge) VALUES('Herry',28);
DB2
DB2中实现自动增长字段有两种方式:定义带有IDENTITY属性的列,使用SEQUENCE对象。
定义带有IDENTITY属性的列:
CREATE TABLE T_Person
(
FId INT PRIMARY KEY NOT NULL
GENERATED ALWAYS
AS IDENTITY
(STARTWITH 1
INCREMENT BY 1
),
FName VARCHAR(20),
FAge INT
);
INSERT INTO T_Person(FName,FAge)VALUES('Tom',18);
INSERT INTO T_Person(FName,FAge)VALUES('Jim',81);
使用SEQUENCE对象:DB2中的SEQUENCE和Oracle中的SEQUENCE相同,只是定义方式和使用方式略有不同。
创建SEQUENCE:
CREATE SEQUENCE seq_PersonId AS INT INCREMENT BY 1 START WITH 1;
INSERT INTOT_Person(FId,FName,FAge) VALUES(NEXTVALUE FOR seq_PersonId,'Kerry',33);
注:也可以参考Oracle实现触发器来自动插入数据。