.net 如何在postgresql中插入和返回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

非常直截了当。我想我可以做一个插入冲突什么也不做然后选择,但我喜欢一行。可能存在冲突,因为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(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
,我试着希望这是一个明显的禁止操作,但我不得不使用你的答案。您可以使用特殊记录
排除
,如更新后的答案。完美。非常感谢。