Возможно ли что-то подобное?
INSERT INTO Table2 (val)
VALUES ((INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id));
как использовать возвращаемое значение в качестве значения для вставки строки во вторую таблицу со ссылкой на первую таблицу?
postgresql
sql-returning
Эйке Кочу
источник
источник
rows
на(some_query returning ...)
(не пробовал).Лучшая практика для этой ситуации. Используйте
RETURNING … INTO
.INSERT INTO teams VALUES (...) RETURNING id INTO last_id;
Обратите внимание, это для PLPGSQL
источник
RETURNING ... INTO
.В соответствии с ответом Дени де Бернарди ..
Если вы хотите, чтобы id также возвращался позже, и хотите вставить больше вещей в Table2:
with rows as ( INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id ) INSERT INTO Table2 (val, val2, val3) SELECT id, 'val2value', 'val3value' FROM rows RETURNING val
источник
DO $$ DECLARE tableId integer; BEGIN INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id INTO tableId; INSERT INTO Table2 (val) VALUES (tableId); END $$;
Протестировано с помощью psql (10.3, сервер 9.6.8)
источник
Вы можете использовать
lastval()
функцию:Так что примерно так:
INSERT INTO Table1 (name) VALUES ('a_title'); INSERT INTO Table2 (val) VALUES (lastval());
Это будет работать нормально, пока никто не вызовет
nextval()
какую-либо другую последовательность (в текущем сеансе) между вашими INSERT.Как Денис отметил ниже, а я предупреждал об этом выше, использование
lastval()
может вызвать у вас проблемы, если доступ к другой последовательности будет осуществлятьсяnextval()
между вашими INSERT. Это могло произойти, если бы был триггер INSERT дляTable1
ручного вызоваnextval()
последовательности или, что более вероятно, INSERT для таблицы с первичным ключомSERIAL
илиBIGSERIAL
. Если вы хотите быть по-настоящему параноиком (хорошо, ведь они действительно вам нужны), то вы можете использовать,currval()
но вам нужно знать название соответствующей последовательности:INSERT INTO Table1 (name) VALUES ('a_title'); INSERT INTO Table2 (val) VALUES (currval('Table1_id_seq'::regclass));
Автоматически сгенерированная последовательность обычно называется
t_c_seq
там, гдеt
имя таблицы и имяc
столбца, но вы всегда можете узнать, войдяpsql
и сказав:а затем посмотрите на значение по умолчанию для рассматриваемого столбца, например:
К вашему сведению:
lastval()
это более или менее версия MySQL для PostgreSQLLAST_INSERT_ID
. Я упоминаю об этом только потому, что многие люди более знакомы с MySQL, чем с PostgreSQL, поэтому ссылкаlastval()
на что-то знакомое может прояснить ситуацию.источник
lastval
том, что за вашей спиной может быть INSERT на основе последовательности из триггера AFTER INSERT в Table1. Это будет в текущем сеансе и, по-видимому, изменится,lastval()
когда вы этого не ожидаете.INSERT INTO table_ex(camp1,camp2) VALUES ('xxx','123') RETURNING id
источник