不同数据库获取新增加的主键值
数据库
|
获取新增主键的查询语句
|
DB2
|
IDENTITY_VAL_LOCAL()
|
Informix
|
SELECT dbinfo('sqlca.sqlerrd1') FROM <TABLE>
|
Sybase
|
SELECT @@IDENTITY
|
SqlServer
|
SELECT SCOPE_IDENTITY()或SELECT @@IDENTITY
|
MySql
|
SELECT LAST_INSERT_ID()
|
HsqlDB
|
CALL IDENTITY()
|
Cloudscape
|
IDENTITY_VAL_LOCAL()
|
Derby
|
IDENTITY_VAL_LOCAL()
|
PostgreSQL
|
SELECT nextval('<TABLE>_SEQ')
|
如果数据库的并发率很高,比如在插入记录后执行查询主键之前,数据库又执行了若干条插入记录的SQL语句,这时,通过表 1 返回的主键值就是最后一条插入语句的主键值,而非我们希望的主键值了。所以使用查询语句获取表自增键值是不安全的,这也是为什么有些数据库(如 Oracle、Firebird)故意不提供自增键,而只提供序列的原因,序列强制要求你在新增记录前,先获取主键值。Oracle通过SELECT <SEQUENCE_NAME>.nextval FROM DUAL获取序列的下一个值,而FireBird通过SELECT GEN_ID(<SEQUENCE_NAME> 1) FROM RDB$DATABASE获取序列的下一个值。在10.4.1小节中,我们还将讲解应用层自增键的相关知识。