我需要为表中的外键列添加值(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的解决方案,但如果有更高版本的替代品,我也想知道。
非常感谢你提前。
您可以使用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;