一个SQL查询使用插入的ID在不同的表中创建多行

时间:2019-04-05 09:12:16

标签: sql postgresql

我需要在一个表中插入一行,并使用该行的ID在一个事务中将另外两行插入不同的表中。我已经尝试过了

begin;
insert into table default values returning table.id as C;
insert into table1(table1_id, column1) values (C, 1);
insert into table1(table1_id, column1) values (C, 2);
commit;

但是它不起作用。我该如何解决?

已更新

2 个答案:

答案 0 :(得分:1)

您需要CTE,并且不需要一次交易/提交就可以完成一次交易:

WITH inserted AS (
    INSERT INTO ... RETURNING id
)
INSERT INTO other_table (id)
SELECT id
FROM inserted;

编辑: 要使用该ID将两行插入到单个表中,可以采用以下两种方法:

  • 两个单独的INSERT语句,一个在CTE中,一个在“主要”部分中
  • 连接值列表的单个INSERT;将为每个值插入一行。

使用这些表格作为设置:

CREATE TEMP TABLE t1 (id INTEGER);
CREATE TEMP TABLE t2 (id INTEGER, t TEXT);

方法1:

WITH inserted1 AS (
        INSERT INTO t1
        SELECT 9
        RETURNING id
), inserted2 AS (
        INSERT INTO t2
        SELECT id, 'some val'
        FROM inserted1
        RETURNING id
)
INSERT INTO t2
SELECT id, 'other val'
FROM inserted1

方法2:

WITH inserted AS (
        INSERT INTO t1
        SELECT 4
        RETURNING id
)
INSERT INTO t2
SELECT id, v
FROM inserted
CROSS JOIN (
        VALUES
        ('val1'),
        ('val2')
) vals(v)

如果您运行其中任何一个,然后检查t2,您将看到它包含预期值。

答案 1 :(得分:0)

请找到以下查询:

  

插入table1(columnName)values('stack2');

     

插入table_2值(SCOPE_IDENTITY(),'val1','val2');