db2中插入数据后直接返回主键(自增列id)的sql怎么写

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了db2中插入数据后直接返回主键(自增列id)的sql怎么写相关的知识,希望对你有一定的参考价值。

如题

参考技术A db2 => CREATE TABLE test_create_tab2 (
db2 (cont.) => id INT NOT NULL PRIMARY KEY generated always as identity,
db2 (cont.) => val VARCHAR(10)
db2 (cont.) => );
DB20000I SQL 命令成功完成。

db2 => INSERT INTO test_create_tab2(val) VALUES ('NO id');
DB20000I SQL 命令成功完成。

这里和 SQL Server 一样,大家都不能手动指定那个 自增id 的数值
db2 => INSERT INTO test_create_tab2(id, val) VALUES (1, 'id no use');
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0798N 不能为定义为 GENERATED ALWAYS 的列 "ID" 指定值。 SQLSTATE=428C9

这里和 SQL Server 不一样,SQL Server 会自动排除掉那个自动递增的列
db2 => INSERT INTO test_create_tab2 VALUES ('Is Auto ?');
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0117N 赋值数目与指定的或隐含的列数或变量数不一样。 SQLSTATE=42802

关于 初始数值的设定。
db2 => drop TABLE test_create_tab2;
DB20000I SQL 命令成功完成。

db2 => CREATE TABLE test_create_tab2 (
db2 (cont.) => id INT NOT NULL PRIMARY KEY generated always as identity
db2 (cont.) => (Start With 100
db2 (cont.) => Increment by 1
db2 (cont.) => minvalue 100
db2 (cont.) => maxvalue 999999999
db2 (cont.) => no cycle cache 5 no order),
db2 (cont.) => val VARCHAR(10)
db2 (cont.) => );
DB20000I SQL 命令成功完成。

db2 => INSERT INTO test_create_tab2(val) VALUES ('NO id');
DB20000I SQL 命令成功完成。

db2 => select * from test_create_tab2;

ID VAL
----------- ----------
100 NO id

1 条记录已选择。

db2 => select identity_val_local() from SYSIBM.SYSDUMMY1;

1
---------------------------------
100.

1 条记录已选择。
参考技术B INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)

--返回自增列
SELECT @@IDENTITY AS 'Identity'

DB2 如何主键自增

简单啊,用序列!不过序列不会自动填充,那么写个触发器,让插入数据的时候,想要自增的主键去获取序列并填充。

自增列不好用,高并发容易出问题。
参考技术A 两个方案
1)sequence自增;
2)自增列
参考技术B 建议建SEQUENCE

以上是关于db2中插入数据后直接返回主键(自增列id)的sql怎么写的主要内容,如果未能解决你的问题,请参考以下文章

SQ数据库中怎样设置自增主键?

主键非自增列 EF 插入数据库引起的 ID 列不能为 NULL 的错误

关于 mysql 事务中的自增 id 的疑问

mybatis主键返回的实现

mysql 批量插入 获取所有自增ID

sql的自增列如何重置