Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何插入记录并返回主键以更新另一个表中的外键?_Sql_Postgresql_Sql Update_Sql Insert_Postgresql 9.4 - Fatal编程技术网

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;