代码之家  ›  专栏  ›  技术社区  ›  Dschoni

如何在vertica中获取最后发布的序列ID?

  •  3
  • Dschoni  · 技术社区  · 6 年前

    背景: 我正在从postgreSQL迁移到Vertica,发现 IDENTITY AUTO_INCREMENT 柱。其中一个问题是,vertica无法将值赋给 身份 列或更改列,该列已将数据转换为 身份 列。因此,我创建了一个序列,并将列的默认值设置为唯一:

    SELECT MAX(id_column) FROM MY_SCHEMA.my_table; 
    

    是12345

    CREATE SEQUENCE MY_SCHEMA.seq_id_column MINVALUE 12346 CACHE 1; 
    
    ALTER TABLE MY_SCHEMA.my_table 
    ALTER COLUMN id_column SET DEFAULT(MY_SCHEMA.seq_id_column.nextval);
    
    ALTER TABLE MY_SCHEMA.log ADD UNIQUE(id_column);
    

    一切如期而至。在本例中,我停用了缓存,因为我是在单节点安装上,我希望我的ID列是连续的。但是,这不是集群安装的选项,因为所需的锁会导致瓶颈。

    问题: 在具有多个节点的vertica集群中,如何访问会话中最后一次插入的ID(不需要额外的select)?

    在postgreSQL中,我可以做一些类似的事情

    INSERT INTO MY_SCHEMA.my_table RETURNING id_column;
    

    在Vertica不起作用。而且 LAST_INSERT_ID() Vertica的函数不适用于命名序列。我也觉得,质疑 current_value 属于 MY_SCHEMA.seq_id_column 可能由于缓存而给出错误的结果,但我对此不确定。

    为什么没有额外的选择?

    据我所知,select只会在提交之后给出正确的值。由于性能原因,我不能在每次插入之后执行提交。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Dschoni    6 年前

    卢克斯托姆的评论给我指明了正确的方向。

    这个 NEXTVAL() 函数(在我测试过的情况下)给出了连续的值,在这种情况下,只有一个会话查询它们。此外,在并发访问时,如果在插入之后发出, CURRVAL 检索缓存值,该值保证是唯一的,但不一定是连续的。我从没打过电话 NEXTVAL 在其他任何地方,如在我的default子句中,这为我解决了问题,尽管可能存在这样的情况,即 下一步 插入之间增加序列计数器。

    我能想到的一个例子(我将在未来测试)是如果 AUTO COMMIT 设置为 OFF ,这是 ON 默认情况下为vertica客户端驱动程序。

    更新:

    这似乎还有用 AUTOCOMMIT 存在 关闭 (使用 vertica-python 客户端驱动程序,其中 C 是连接和 cur 光标):

    cur.execute("SELECT NEXTVAL('my_schema.my_sequence');")
    cur.fetchall()
    --> 1
    cur.execute("SELECT CURRVAL('my_schema.my_sequence');")
    cur.fetchall()
    --> 1
    cur.execute("SET SESSION AUTOCOMMIT TO OFF")
    cur.execute("SELECT NEXTVAL('my_schema.my_sequence');")
    cur.execute("SELECT NEXTVAL('my_schema.my_sequence');")
    cur.execute("SELECT NEXTVAL('my_schema.my_sequence');")
    cur.execute("SELECT CURRVAL('my_schema.my_sequence');")
    cur.fetchall()
    --> 4
    

    但是,在连接回滚期间,这似乎没有变化。所以会发生以下情况:

    C.rollback()
    cur.execute("SELECT CURRVAL('my_schema.my_sequence');")
    cur.fetchall()
    --> 4