last_insert_id是否在所有会话多客户端环境中提供特定于会话的值或全局值?

问题描述

我有一个表,该表在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

仍然保持旧值...