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

时间:2019-04-05 12:33:44

标签: sql postgresql sql-update sql-insert postgresql-9.4

我需要在表(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的解决方案,但是如果有更高版本的替代方案,我也想知道。

非常感谢您。

1 个答案:

答案 0 :(得分: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;