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

标签 mysql oracle

我不完全明白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/

相关文章:

c - OCIStmtPrepare 总是返回 OCI_INVALID_HANDLE

mysql - SQL如何将列追加到单行结果集?

php - 使用 EZPDF 通过 PHP 从 Mysql 导出时如何使表响应

子查询中的 mysql sql_mode=only_full_group_by 不起作用

sql - SQL查询结果中用空白单元格替换 "(null)"

sql - 内部查询对Oracle不起作用?

java - 使用 mysql 分割 .csv 文件

mysql:创建表后添加外键

mysql - mysql行之间的区别

用于批量插入语句的 oracle Alter Session NLS FORMAT - 未按预期运行