如何插入记录并返回主键以更新另一个表中的外键?

问题描述 投票:2回答:1

我需要为表中的外键列添加值(table1)。为此我必须在另一个表(table2)中创建一个新记录并返回句柄以在第一个表(table1)中使用外键更新列。

此外,当我在table2中插入新记录时,我需要table1中包含table2中其中一列的值。

UPDATE table1 
SET table2_id = (INSERT INTO table2 (id, anumber, atimestamp, atext) 
                VALUES (nextval('seqtable2'), 0, NOW()::TIMESTAMP, table1.anumber::TEXT) 
                RETURNING id );

我相信使用上面的脚本(甚至不工作)可以理解这个问题。我用最简单,最概括的方式写作。

我正在寻找PostgreSQL 9.4的解决方案,但如果有更高版本的替代品,我也想知道。

非常感谢你提前。

sql postgresql sql-update sql-insert postgresql-9.4
1个回答
1
投票

您可以使用pg / psql,如下所示:

DO
$updatecode$
DECLARE
  i int;
BEGIN

  INSERT INTO table2 (id, anumber, atimestamp, atext) 
  VALUES (nextval('seqtable2'), 0, NOW()::TIMESTAMP, 2::TEXT) 
  RETURNING id into i;

  UPDATE table1 SET table2_id = i WHERE ...

END;
$updatecode$
LANGUAGE plpgsql;

编辑:

我不得不添加循环,因为我需要更改多个记录。另一个变化是能够在table1列中使用atext值,同时将记录插入table2

DO 
$insertforupdate$
DECLARE 
    tbl1 table1%ROWTYPE;
    tbl2_id INTEGER;
BEGIN 

    FOR tbl1 IN SELECT * FROM table1 
    LOOP 

        INSERT INTO table2 (id, anumber, atimestamp, atext) 
        VALUES (nextval('seqtable2'), 0, NOW()::TIMESTAMP, tbl1.anumber::TEXT) 
        RETURNING id INTO tbl2_id;

        UPDATE table1 SET table2_id = tbl2_id WHERE id = tbl1.id;

    END LOOP;

END;
$insertforupdate$
LANGUAGE plpgsql;
© www.soinside.com 2019 - 2024. All rights reserved.