背景:我从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()
功能不适用于命名序列。我还感到,由于缓存,查询current_value
的MY_SCHEMA.seq_id_column
可能会给出错误的结果,但是我不确定。为什么没有其他选择?
据我所知,选择仅会在提交后给出正确的值。由于性能原因,我无法在每次插入后进行提交。
最佳答案
LukStorms的评论为我指明了正确的方向。NEXTVAL()
函数(据我所测试)在一个会话查询它们的情况下给出连续值。此外,在并发访问中,如果在插入之后发出,则CURRVAL
会检索缓存的值,该值被保证是唯一的,但不一定是连续的。因为我从来没有像我的默认子句中那样在其他任何地方调用NEXTVAL
,所以这为我解决了这个问题,尽管在某些情况下,插入之间对NEXTVAL
的附加调用会增加序列计数器。
我可以想到的一种情况(以后将进行测试)是将AUTO COMMIT
设置为OFF
的情况,对于vertica客户端驱动程序,默认情况下将其设置为ON
。
更新:
这甚至可以在AUTOCOMMIT
为OFF
的情况下使用(使用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/