2017-02-16 1 views
1

Я хотел бы создать файл SQL для вставки тестовых данных в мою базу данных. У меня есть глобальная последовательность для всей базы данных, и я тоже хотел бы использовать ее здесь.Как повторно использовать значения последовательности в качестве внешнего ключа в файле DML SQL PostgreSQL?

Для этого при создании полей PK id я использую nextval("mySeq"). Чтобы ссылаться на это позже в FK, я могу использовать currval("mySeq"). Проблема возникает, когда я создаю таблицу с несколькими FK. В этом случае мне нужно несколько предыдущих значений из последовательности.

Вот маленький пример:

insert into table1 (id) values(nextval("seq")); 
insert into table2 (id) values(nextval("seq")); 
insert into table3 (id) values(nextval("seq")); 

insert into table_sum (table1_FK, table2_FK, table3_FK) values (?????????????) 

Что/я должен делать в этом случае? Если это не правильный способ сделать это, я также заинтересован в альтернативных решениях. :)

+0

, так что если вы вставляете 4 строки, вам нужно будет окунуться в таблицу_sum с четырьмя столбцами? .. –

+1

Это похоже на действительно странный дизайн –

+0

@a_horse_with_no_name Почему? Я открыт для лучших решений, но что странно? –

ответ

0
with 
    t1 as (insert into table1 (id) values(nextval("seq")) returning id), 
    t2 as (insert into table2 (id) values(nextval("seq")) returning id), 
    t3 as (insert into table3 (id) values(nextval("seq")) returning id) 
insert into table_sum (table1_FK, table2_FK, table3_FK) 
    select t1.id, t2.id, t3.id from t1, t2, t3; 

Очевидно, что он будет работать только для одного ряда. Если вы хотите вставить несколько строк в один оператор, вы должны каким-то образом присоединиться к CTE.