【发布时间】:2018-07-30 15:10:13
【问题描述】:
背景:我正在从 postgreSQL 迁移到 Vertica,发现 IDENTITY 或 AUTO_INCREMENT 列中存在一些问题。其中一个问题是,vertica 无法将值分配给IDENTITY 列或更改已将数据放入IDENTITY 列的列。因此,我创建了一个序列并将列的默认值设置为唯一的:
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(无需额外选择)?
例如在 postgreSQL 中我可以做类似的事情
INSERT INTO MY_SCHEMA.my_table RETURNING id_column;
这在 Vertica 中不起作用。此外,Vertica 的LAST_INSERT_ID() 函数不适用于命名序列。我也觉得,查询MY_SCHEMA.seq_id_column 的current_value 可能会由于缓存而给出错误的结果,但我对此不确定。
为什么没有额外的 SELECT?
据我所知,选择只会在提交后给出正确的值。由于性能问题,我无法在每次插入后进行提交。
【问题讨论】:
-
你检查系统表SEQUENCES了吗?另外,请您描述一下您通过获取最后一个插入 id 来实现的目标吗?
-
如前所述,SEQUENCES 不支持 LAST_INSERT_ID,我担心在查询 SEQUENCES 表时会遇到竞争条件。我只想拥有会话中最后插入条目的主键。
-
我想知道 CURRVAL 是否适用于此? F.e.
CURRVAL(MY_SCHEMA.seq_id_column)。 Reference。啊没关系,你担心缓存的效果。 走开 -
@LukStorms 实际上,确实如此。我用两个并发会话尝试了这个,每个会话都给了我正确的(缓存的)值。如果您将评论添加为答案,您将获得赏金。
-
谢谢,虽然很诱人,但我还是会转告的。会感觉不对。我所做的只是根据以前使用其他分布式 DBMS 的经验查找一些文档。我无法访问 Vertica。而且我不喜欢发布一个我无法测试自己的答案,或者不知道它会不会用心。既然您已经通过测试完成了繁重的工作,并且没有其他人提出一个体面的答案,那么这些点也可能会退还给您。也许您甚至可以发布自己的答案。因为这个问题本身可能对有一天会遇到同样问题的其他人有用。