[笔记]流行数据库SQL差异分析之“自动增长字段”
2010-11-30 06:46
543 查看
自动增长字段
在设计数据库的时候,有时需要表的某个字段是自动增长的,最常使用自动增长字段的就是表的主键,使用自动增长字段可以简化主键的生成。不同的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实现触发器来自动插入数据。
在设计数据库的时候,有时需要表的某个字段是自动增长的,最常使用自动增长字段的就是表的主键,使用自动增长字段可以简化主键的生成。不同的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实现触发器来自动插入数据。
相关文章推荐
- [笔记]流行数据库SQL差异分析之“限制结果集行数”
- [笔记]流行数据库SQL差异分析之“不从实体表中取得数据”
- 流行数据库SQL差异分析之“限制结果集行数”
- sql语句查询数据库中的表名/列名/主键/自动增长值实例
- 设置自动增长的数据库字段
- sql语句查询数据库中的表名/列名/主键/自动增长值
- 在PL/SQL Developer里设置Oracle数据库的字段自动递增功能
- 在Oracle、MySQL、MS SQL Server中创建自动增长字段
- 用PL/SQL编辑表格,使其字段自动增长。
- [SQL Server] 数据库日志文件自动增长导致连接超时的分析
- SQL 2000创建表的时候设置某一字段为自动增长的类型
- sql service重置自动增长字段数字的方法
- 数据库中自动增长的字段类型
- 在Oracle、MySQL、MS SQL Server中创建自动增长字段
- SQL 数据库 学习 032 identity的用法 --- 如何设置主键自动增长(用户不需要为identity修饰的主键赋值)
- SQL 实现从表中自动增长字段的最大值向上自动增长
- [SQL Server] 数据库日志文件自动增长导致连接超时的分析
- 数据库日志文件自动增长导致连接超时的分析
- sql优化:从设计表结构开始(SQL Server中如何让数据库中某一个字段随时间自动更新?)
- 关于SQL Server自动增长字段