问题描述
我有一个表,该表在vertica db中具有AUTO_INCREMENT列,并将该列用作其他表的外键。为此,我需要为AUTO_INCREMENT列最后插入一个值。
CREATE TABLE orders.order_test
(
order_id AUTO_INCREMENT(1,1,1) PRIMARY KEY,order_type VARCHAR(255)
);
找到了此功能,但不确定如何在多个会话中使用吗? https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/SQLReferenceManual/Functions/VerticaFunctions/LAST_INSERT_ID.htm
上面的链接说: 返回AUTO_INCREMENT / IDENTITY列的最后一个值。如果多个会话同时使用AUTO_INCREMENT / IDENTITY列加载同一张表,则该函数将返回为该列生成的最后一个值。
解决方法
是按会话进行的。
让我们测试一下。
两个命令行窗口。两者均以vsql
开头。
成绩单是整个课程的全部内容。
交易1:
sbx=> select export_objects('','id1',false);
CREATE TABLE dbadmin.id1
(
id IDENTITY,num int
);
[. . .]
sbx=> select * from id1;
id | num
--------+-----
250001 | 1
sbx=> \pset null NULL
Null display is "NULL".
sbx=> SELECT LAST_INSERT_ID();
LAST_INSERT_ID
----------------
NULL
-- insert a row ...
sbx=> INSERT INTO id1 (num) VALUES(2);
OUTPUT
--------
1
sbx=> SELECT LAST_INSERT_ID();
LAST_INSERT_ID
----------------
500001
交易2:
sbx=> SELECT LAST_INSERT_ID();
LAST_INSERT_ID
----------------
NULL
-- now insert another row ...
sbx=> INSERT INTO id1 (num) VALUES(3);
OUTPUT
--------
1
sbx=> SELECT LAST_INSERT_ID();
LAST_INSERT_ID
----------------
750001
现在,回到交易1:
sbx=> SELECT LAST_INSERT_ID();
LAST_INSERT_ID
----------------
500001
仍然保持旧值...