.net 如何在postgresql中插入和返回ID?
非常直截了当。我想我可以做一个插入冲突什么也不做然后选择,但我喜欢一行。可能存在冲突,因为c1是唯一的。我想插入,然后返回具有column1(c1)的任何行的id.net 如何在postgresql中插入和返回ID?,.net,postgresql,.net,Postgresql,非常直截了当。我想我可以做一个插入冲突什么也不做然后选择,但我喜欢一行。可能存在冲突,因为c1是唯一的。我想插入,然后返回具有column1(c1)的任何行的id 当到达子句donothing时,查询不返回任何行。在这种情况下,返回fooid的唯一方法是执行冗余更新: insert into foo (c1) values (@c1) on conflict (c1) do update set c1 = excluded.c1 returning fooid; WITH payload
当到达子句
donothing
时,查询不返回任何行。在这种情况下,返回fooid
的唯一方法是执行冗余更新:
insert into foo (c1)
values (@c1)
on conflict (c1) do update set c1 = excluded.c1
returning fooid;
WITH payload(c1) AS (
SELECT @c1 -- your parameters here, you might have to CAST() them
), insert_action(c1) AS (
INSERT INTO foo(c1)
SELECT c1 FROM payload
ON CONFLICT (c1) DO NOTHING
RETURNING c1
)
SELECT c1
FROM insert_action
RIGHT JOIN payload USING(c1);
您可以使用公共表表达式来避免冗余更新:
insert into foo (c1)
values (@c1)
on conflict (c1) do update set c1 = excluded.c1
returning fooid;
WITH payload(c1) AS (
SELECT @c1 -- your parameters here, you might have to CAST() them
), insert_action(c1) AS (
INSERT INTO foo(c1)
SELECT c1 FROM payload
ON CONFLICT (c1) DO NOTHING
RETURNING c1
)
SELECT c1
FROM insert_action
RIGHT JOIN payload USING(c1);
我想这会被优化掉吗?(我们可以假设它应该,但会吗?)我不知道,目前的解释是合乎逻辑的:没有行动,就没有结果。不过,你的建议似乎更切合实际。如果我
返回fooid
并且没有得到任何行,我可以理解。然而,这是一个select语句。不幸的是,它不允许c1=c1
,我试着希望这是一个明显的禁止操作,但我不得不使用你的答案。您可以使用特殊记录排除
,如更新后的答案。完美。非常感谢。