我不完全明白Oracle的sequence和MySql的auto_increment的区别。
我是一个mysql人,但对oracle一无所知。我希望有人可以为我快速了解这一点。
最佳答案
序列是 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');
在 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');
每次您提到序列的 .nextval
属性时,它都会保证提供一个新数字。
当您需要与某个表或其他表的主键没有直接关系的唯一数字时,序列对象非常酷。您可以在 MySQL 中执行此操作,但这有点麻烦:如果您创建下表:
CREATE TABLE sequence ( /*MySQL*/
sequence_id BIGINT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`sequence_id`)
)
然后依次发出这三个查询:
INSERT INTO sequence () VALUES (); /*MySQL*/
DELETE FROM sequence WHERE sequence_id < LAST_INSERT_ID();
SELECT LAST_INSERT_ID() AS sequence;
第三个查询保证返回一个唯一的序列号。即使您有许多不同的客户端程序连接到您的数据库,此保证仍然有效。 (DELETE
查询只是防止这个毫无意义的表占用太多空间。)
使用 Oracle,您可以创建序列
create sequence seq --Oracle
然后就是做
SELECT seq.nextval FROM DUAL --Oracle
得到一个新的序列号,就是这样。即使有数十个连接的客户端程序,它也能保证唯一性。
同样,如果您需要刚刚使用 .nextval
生成的序列的值,您可以发出此命令并获取它。
SELECT seq.currval FROM DUAL --Oracle
与 MySQL 的 LAST_INSERT_ID()
一样,这是逐个 session 处理的,因此使用该序列的其他客户端不会让您获得他们的编号而不是您的编号。
底线:两种 DBMS 都可以生成唯一的整数。这两种方案的完整性旨在在服务器停止和重新启动时保持不变。 Oracle 序列更灵活。
关于mysql - Oracle的 "sequence"和MySql的Auto_increment特性有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27867980/