Как вставить запись и вернуть первичный ключ для обновления внешнего ключа в другой таблице? - PullRequest
2 голосов
/ 05 апреля 2019

Мне нужно добавить значение в столбец внешнего ключа в таблице (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 Ответ

1 голос
/ 05 апреля 2019

Вы можете использовать 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;
...