Oracle 的 "sequence" 和 MySql 的 Auto_increment 特性有什么区别?

What is the difference between Oracle's "sequence" and MySql's Auto_increment feature?

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

我是mysql人,但对oracle一无所知。我希望有人能为我快速阐明这一点。

Oracle 没有自动递增列。您需要创建一个序列,然后在插入触发器之前从序列中读取 NEXTVAL 并设置列的值

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

在 MySQL 中,当你有一个自动增量列并且你在 table 中插入一个新行时,你只是不提及自动增量列并且 MySQL 把它放在那里.然后,您可以通过引用 LAST_INSERT_ID().

将相同的数字插入另一个 table
 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属性,它保证给出一个新的数字。

当您需要与某些 table 或其他的主键没有直接关系的唯一数字时,序列对象非常酷。您可以在 MySQL 中执行此操作,但这有点麻烦:如果您创建以下 table:

 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;

第三个查询保证return一个唯一的序列号。即使您有许多不同的客户端程序连接到您的数据库,此保证仍然有效。 (DELETE 查询只是让这个毫无意义的 table 不会占用太多 space。)

使用 Oracle,您创建序列

create sequence seq                                           --Oracle

然后

SELECT seq.nextval FROM DUAL                                  --Oracle

获得一个新的序列号,仅此而已。即使有数十个连接的客户端程序,它也能保证唯一性。

类似地,如果您需要刚刚用.nextval生成的序列的值,您可以发出此命令并获取它。

SELECT seq.currval FROM DUAL                                 --Oracle

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

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

Oracle DB 中的序列是一个单独的实体,您可以在查询中访问它以 get/increment 它的值,并且您可以将相同的序列用于多个 table/field.

MySQL 中的自动递增绑定到 table 中的单个字段,并用于定义该字段的值,当它未在插入查询中给出时。