Oracle的"序列"和MySql的Auto_increment功能有什么区别?

Dan*_*man 12 mysql oracle

我不完全理解Oracle的序列和MySql的auto_increment之间的区别.

我是一个mysql的家伙,但对oracle一无所知.我希望有人可以为我快速阐明这一点.

O. *_*nes 11

序列是Oracle中的一个独特的数据库对象.

在MySQL中,当你有一个自动增量列并且你在表中插入一个新行时,你根本就没有提到自动增量列,MySQL就把它放在那里.然后,您可以通过引用将相同的数字插入另一个表中LAST_INSERT_ID().

 INSERT INTO person  (name, date)                             /*MySQL*/
                 VALUES ('joe', '2015-01-01');
 INSERT INTO contact (person_id, phone)
                 VALUES (LAST_INSERT_ID(), '555-1212');
Run Code Online (Sandbox Code Playgroud)

在Oracle中,您可以通过提及序列对象的.nextval属性来填充id列.您可以通过引用其.currval属性来获取该序列的正常使用值.

 INSERT INTO person (id, name, date)                         -- Oracle
                   VALUES (person_seq.nextval, 'joe', '2015-01-01');
 INSERT INTO contact (id, person_id, phone)
                   VALUES (contact_seq.nextval, person_seq.currval, '555-1212');
Run Code Online (Sandbox Code Playgroud)

每次提到序列的.nextval属性时,都保证给出一个新的数字.

当您需要与某些表或其他表的主键不直接相关的唯一数字时,序列对象非常酷.您可以在MySQL中执行此操作,但它是一个kludge:如果您创建下表:

 CREATE TABLE sequence (                                       /*MySQL*/
     sequence_id BIGINT NOT NULL AUTO_INCREMENT,
     PRIMARY KEY (`sequence_id`)
) 
Run Code Online (Sandbox Code Playgroud)

然后一个接一个地发出这三个查询:

INSERT INTO sequence () VALUES ();                            /*MySQL*/
DELETE FROM sequence WHERE sequence_id < LAST_INSERT_ID();
SELECT LAST_INSERT_ID() AS sequence;
Run Code Online (Sandbox Code Playgroud)

保证第三个查询返回唯一的序列号.即使您有数十个不同的客户端程序连接到您的数据库,此保证仍然有效.(DELETE查询只是让这个没有意义的表占用太多空间.)

使用Oracle,您可以创建序列

create sequence seq                                           --Oracle
Run Code Online (Sandbox Code Playgroud)

然后就做

SELECT seq.nextval FROM DUAL                                  --Oracle
Run Code Online (Sandbox Code Playgroud)

得到一个新的序列号就是这样.即使有数十个连接的客户端程序,它也保证了唯一性.

同样,如果您需要刚刚生成的序列的值,则.nextval可以发出此命令并获取它.

SELECT seq.currval FROM DUAL                                 --Oracle
Run Code Online (Sandbox Code Playgroud)

与MySQL一样LAST_INSERT_ID(),这是逐个会话处理的,因此使用该序列的另一个客户端不会让你获得他们的号码而不是你的号码.

底线:两个DBMS都可以生成唯一的整数.两种方案的完整性旨在跨服务器停止和重新启动保留.Oracle序列更灵活.