【问题标题】:How do I insert and return the ID in postgresql?如何在 postgresql 中插入和返回 ID?
【发布时间】:2017-05-02 22:36:56
【问题描述】:

非常直接。我想我可以对冲突进行插入,然后选择,但我喜欢一个衬里。由于 c1 是唯一的,因此可能存在冲突。我想插入然后返回具有 column1 (c1) 的任何行的 id。

insert into foo(c1)
    VALUES(@c1, 0)
on conflict (c1) do nothing
RETURNING (select fooid from foo where c1=@c1)

【问题讨论】:

    标签: .net postgresql


    【解决方案1】:

    当到达子句do nothing 时,查询不返回任何行。在这种情况下返回fooid的唯一方法是执行冗余更新:

    insert into foo (c1)
    values (@c1)
    on conflict (c1) do update set c1 = excluded.c1
    returning fooid;
    

    【讨论】:

    • 我认为这会被优化掉? (我们可以假设它应该,但它会吗?)
    • 我不知道,目前的解释是合乎逻辑的:没有行动,没有结果。不过,您的建议似乎更实用。
    • 是的。如果我做了returning fooid 并且没有得到任何行,我可以理解。然而,这是一个选择语句。不幸的是,它不允许c1 = c1,我试图希望它作为无操作很明显,但不,我不得不使用你的答案。到T
    • 您可以使用特殊记录excluded,就像在更新的答案中一样。
    • 完美。谢谢
    【解决方案2】:

    您可以使用公用表表达式来避免冗余更新:

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-10
      • 2013-08-14
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多