我不完全理解Oracle的序列和MySql的auto_increment之间的区别。
我是一个mysql人,但对oracle一无所知。我希望有人能为我快速阐明这一点。
答案 0 :(得分: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');
在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中执行此操作,但它是一个kludge:如果您创建下表:
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()
一样,这是逐个会话处理的,所以使用该序列的另一个客户端不会让你获得他们的号码而不是你的号码。
底线:两个DBMS都可以生成唯一的整数。两种方案的完整性旨在跨服务器停止和重新启动保留。 Oracle序列更灵活。
答案 1 :(得分:4)
Oracle DB中的序列是一个单独的实体,您可以在查询中访问它以获取/增加其值,并且您可以对多个表/字段使用相同的序列。
MySQL中的自动增量绑定到表中的单个字段,并用于定义该字段的值,当插入查询中未给出该字段时。
答案 2 :(得分:0)
Oracle没有自动增量列。您需要创建一个序列,然后在插入触发器之前从序列中读取NEXTVAL并设置列的值