2016-08-12 2 views
0

Я попытался вставить данные в 2 таблицы, где table2 не имеет первичного ключа, но только зарубежные:выбрать последний идентификатор возвращается тот же результат для нескольких запросов

insert into table1 ....; 
insert into table2 (a, column2, c) values(1, (select id from table1 order by inserted_at desc limit 1), 33); 

insert into table1 ....; 
insert into table2 (a, column2, c) values(1, (select id from table1 order by inserted_at desc limit 1), 33); 

insert into table1 ....; 
insert into table2 (a, column2, c) values(1, (select id from table1 order by inserted_at desc limit 1), 33); 

, и я закончил с тем же идентификатором в table2 для column2 во всех 3 запросах. Почему и как я мог это исправить?

+0

Вы уверены, что вы не вставляют подобные данные в 'table1' во все 3 итерации? Очень сложно понять, если вы не дадите точные инструкции вставки для 'table1' и объясните, как в них используется« insert_at ». Я предполагаю, что вы вставляете sysdate в это, но без вставных операторов, мы можем только догадываться. – Utsav

+0

Используйте последовательную колонку. Не вычисляйте идентификаторы самостоятельно - база данных делает это для вас. –

+0

@ GordonLinoff, я этого не делаю. – Johshi

ответ

0

, потому что вы подножка 3 вставки в одной транзакции

вы должны добавить каждый befere вставить start transaction; и после каждой вставки commit;

+1

Не уверен, что это правильно. Внутри транзакции значения должны быть видимыми. Скорее всего, OP использует системную дату, и все вставки имеют одно и то же значение, но могут быть подтверждены только после того, как в вопрос будут отправлены полные данные. – Neeraj

+0

@Neeraj: Если 'вставленный_at' основан на умолчанию' now() ', он будет заморожен на отметке времени начала транзакции. – joop

1

рассмотреть делать вместо этого:

INSERT INTO table2 (a, column2, c) VALUS(1, (INSERT INTO table1 ... RETURNING id), 33); 
+0

это аккуратно. можно ли объявить переменную в чистых sql-указаниях, как в моем вопросе, и использовать ее для сохранения идентификатора, возвращаемого из «insert into table1»? – Johshi

+0

Переменные объявления поставляются с PLSQL. – emacsx

+0

Можно ли объявить переменную в чистых sql-указаниях, как в моем вопросе, и использовать ее для сохранения возвращаемого идентификатора из «insert into table1»? – Johshi

Смежные вопросы