如何插入一条记录并把return的主键更新到另一个table的外键?
How to insert a record and return the primary key to update the foreign key in another table?
我需要向 table (table1
) 中的外键列添加值。为此,我必须在另一个 table (table2
) 和 return 句柄中创建一个新记录,以在第一个 table (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;
编辑:
我不得不添加一个循环,因为我需要更改多条记录。另一个更改是在将记录插入 table2
.
时能够在 atext
列中使用值 table1
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;
我需要向 table (table1
) 中的外键列添加值。为此,我必须在另一个 table (table2
) 和 return 句柄中创建一个新记录,以在第一个 table (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;
编辑:
我不得不添加一个循环,因为我需要更改多条记录。另一个更改是在将记录插入 table2
.
atext
列中使用值 table1
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;