【问题标题】:How to insert and then update returned Id from insert query as returning id in a single command in postgres?如何在postgres的单个命令中插入然后更新从插入查询返回的ID作为返回ID?
【发布时间】:2020-06-05 12:48:30
【问题描述】:

我有一个演示表

CREATE TABLE items (
  id SERIAL primary key,
  user_id integer,
  name character varying,
  created timestamp with time zone default now()
);

我希望运行单个查询并首先插入数据,然后使用返回的 id 返回主键,然后使用返回的 id 更新同一个表。

INSERT INTO items (name) values ('pen') RETURNING id as idd 
update items set user_id=(select idd) where id=(select idd)

但上述命令不起作用并引发语法错误。 如有任何帮助,我们将不胜感激。

【问题讨论】:

  • 为什么要更改主键?
  • 我没有更改主键,我只是想插入我在 user_id 列中获得的主键。
  • 如何向items 表添加一个触发器,将列user_id 设置为生成的id 值,而不是在插入后立即执行更新?无论如何,为什么要将ID两次存储在同一张表中?这不是和normalization 矛盾吗?
  • 有一个特定的要求,因为这并非在所有情况下都是如此。我正在数据库中创建某种树结构。与我的前辈讨论过触发器,但他们说这会不必要地复杂表和数据库结构
  • 如果数据库触发器不是一个选项,那么执行 INSERT 和后续 UPDATE 的 PL/pgSQL 例程呢?或者这是否也会使结构变得不必要地复杂?

标签: postgresql sql-insert auto-increment


【解决方案1】:

你也可以试试这个方法:

create temp table insert_item as 
with insert_item_cte as ( 
INSERT INTO items (name) 
 values ('pen') returning id 
) 
select id from insert_item_cte;

update items set user_id = items.id 
from insert_item ii 
where ii.id = items.id;

Online Demo

【讨论】:

    【解决方案2】:

    您可以直接在 INSERT 语句中执行此操作:

    INSERT INTO items 
      (name, user_id) 
    values 
      ('pen', currval(pg_get_serial_sequence('items','id')));
    

    Online example

    【讨论】:

    • 感谢它的工作。因此,如果是这样的话,可以使用返回 Id 而不是 currval :)
    • @SanyamMadaan:不行,values子句中的其他列不能引用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    相关资源
    最近更新 更多