Вставить результат из одного запроса вставки в другой вставить

#sql #string #postgresql #sql-insert #common-table-expression

#sql #строка #postgresql #sql-вставить #common-table-expression

Вопрос:

У меня есть две таблицы psotgres. Таблица 1 имеет идентификатор пользователя в качестве первичного ключа. Таблица 2 использует идентификатор пользователя в качестве внешнего ключа, мне нужно вставить данные в таблицы 1 и 2. Я хочу сделать все это в одном операторе, если вставка в таблицу 2 завершается неудачно, мне нужно, чтобы вставка в таблицу 1 была удалена дважды.

 INSERT into table1 (userid,email)Values(12,"example@gmail.com") RETURNING userid

INSERT into table2(userid,name,address)Values(12,"Joe","123 test Dr") 
  

Как я могу сделать это в одном операторе?

Ответ №1:

Вам просто нужно обернуть первый insert в with предложение. Если вы знаете все значения заранее, вам даже не нужно returning :

 with ins as (
    insert into table1 (userid, email)
    values(12,'example@gmail.com') 
)
insert into table2 (userid, name, address)
values(12, 'Joe', '123 test Dr')
  

С другой стороны, если userid это автоматически сгенерированное значение, то вы можете вернуть его из CTE и использовать в другой вставке следующим образом:

 with ins as (
    insert into table1 (email)
    values('example@gmail.com') 
    returning userid
)
insert into table2 (userid, name, address)
select userid, 'joe', '123 test Dr'
from ins
  

Примечание: используйте одинарные кавычки для буквенных строк. Двойные кавычки используются для идентификаторов (имена столбцов, имена таблиц и так далее).

Комментарии:

1. не выполняется ли первая вставка, если вторая вставка завершается неудачно?

2. @JuliaT: в принципе, да, это все или ничего.

3. Большое вам спасибо!