postgresql – 从Posgtres批量插入返回多个SERIAL值
我正在使用Postgres,使用SERIAL作为我的主键.插入一行后,我可以使用’RETURNING’或CURRVAL()来获取生成的键.
现在我的问题是我想在事务中进行批量插入并获取所有生成的密钥. 我用RETURNING和CURRVAL得到的是最后生成的id,结果的其余部分被丢弃. 我怎样才能让它归还所有这些? 谢谢
您可以将RETURNING与多个值一起使用:
psql=> create table t (id serial not null,x varchar not null); psql=> insert into t (x) values ('a'),('b'),('c') returning id; id ---- 1 2 3 (3 rows) 所以你想要更像这样的东西: INSERT INTO AutoKeyEntity (Name,Description,EntityKey) VALUES ('AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a','Testing 5/4/2011 8:59:43 AM',DEFAULT) returning EntityKey; INSERT INTO AutoKeyEntityListed (EntityKey,Listed,ItemIndex) VALUES (CURRVAL('autokeyentity_entityKey_seq'),'Test 1 AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a',0),(CURRVAL('autokeyentity_entityKey_seq'),'Test 2 AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a',1),'Test 3 AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a',2) returning EntityKey; -- etc. 然后,您必须从事务中的每个语句中收集返回的EntityKey值. 你可以尝试在事务的开始和结束时获取序列的当前值,并使用它们来确定使用了哪些序列值但是that is not reliable:
因此,即使您的序列的缓存值为1,您仍可在事务中使用非连续的序列值.但是,如果序列的缓存值与事务中INSERT的数量相匹配,那么您可能会安全,但我猜这会太大而无法理解. 更新:我刚刚注意到(感谢提问者的评论),涉及两个表,在文本墙中有点丢失. 在这种情况下,您应该能够使用当前的INSERTS: INSERT INTO AutoKeyEntity (Name,2); -- etc. 并从AutoEntityKey上的INSERT一次获取一个EntityKey值.可能需要某种脚本来处理RETURNING值.您还可以在函数中包装AutoKeyEntity和相关的AutoKeyEntityListed INSERT,然后使用 INSERT INTO AutoKeyEntity /*...*/ RETURNING EntityKey INTO ek; /* AutoKeyEntityListed INSERTs ... */ RETURN ek; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |