Sql 如何插入记录并返回主键以更新另一个表中的外键?
我需要向表中的外键列添加值(Sql 如何插入记录并返回主键以更新另一个表中的外键?,sql,postgresql,sql-update,sql-insert,postgresql-9.4,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('seqtab
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 );
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;
我相信通过上面的脚本(即使不起作用)可以理解问题。我用最简单、最概括的方式写作
我正在寻找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;
编辑:
我必须添加一个循环,因为我需要更改多个记录。另一个变化是能够在atext
列中使用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 );
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;