背景:我从PostgreSQL迁移到Vertica,发现IDENTITYAUTO_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()功能不适用于命名序列。我还感到,由于缓存,查询current_valueMY_SCHEMA.seq_id_column可能会给出错误的结果,但是我不确定。

为什么没有其他选择?

据我所知,选择仅会在提交后给出正确的值。由于性能原因,我无法在每次插入后进行提交。

最佳答案

LukStorms的评论为我指明了正确的方向。

NEXTVAL()函数(据我所测试)在一个会话查询它们的情况下给出连续值。此外,在并发访问中,如果在插入之后发出,则CURRVAL会检索缓存的值,该值被保证是唯一的,但不一定是连续的。因为我从来没有像我的默认子句中那样在其他任何地方调用NEXTVAL,所以这为我解决了这个问题,尽管在某些情况下,插入之间对NEXTVAL的附加调用会增加序列计数器。

我可以想到的一种情况(以后将进行测试)是将AUTO COMMIT设置为OFF的情况,对于vertica客户端驱动程序,默认情况下将其设置为ON

更新:

这甚至可以在AUTOCOMMITOFF的情况下使用(使用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

关于sql - 如何获得Vertica中最后发布的序列ID?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51597088/

10-12 17:24