2016-03-29 8 views
1

У меня есть три типа данных, tableA, tableB и tableAB. Содержимое не очень важно, только tableA и tableB имеют первичные ключи, а tableAB связывает ключи в двух таблицах. Основная структура ниже:
Выберите из Вставить в

aId|data 
---+---- 
1 |4 
2 |83 

bId|data 
---+---- 
1 |a 
2 |cd 
3 |bf 

abId|aId|bId 
----+---+--- 
1 |1 |1 
2 |1 |2 
3 |2 |3 

То, что я хотел бы сделать, это объединить вставки всех этих трех таблиц в одном запросе, но я не знаю, как. Текущая идея, с которой я работаю, ниже, но она не работает. Важно отметить, что aId может относиться к нескольким bId, но у каждого bId будет только один aId, ссылающийся на него. Таким образом, aId могут не ссылаться на существующие bId. Большие вещи, с которыми я борюсь, - это 1) значение insert происходит от другого insert и 2) имитирует несколько вложений, для bId, в одном запросе.

Текущий запрос:

insert into tableAB(aId, bId) 
values((select aId from(insert into tableA(data) values(5))), 
     (select bId from(insert into tableB(data) values("f")))); 

Я действительно не уверен, что несколько вставок в одном запросе можно и не знаю, как писать его выше.

+0

Вставка нескольких таблиц в одном запросе не поддерживается MySQL. :( – Sevle

+0

Вы можете делать то, что хотите в Postgres, но MySQL не поддерживает вставки в несколько таблиц в одном запросе. –

+0

Существует LAST_INSERT_ID, см. [Manual] (http://dev.mysql.com/doc/ refman/5.7/en/information-functions.html # function_last-insert-id), образец: http://www.sqlfiddle.com/#!9/a8102/1/0 –

ответ

1

Используйте LAST_INSERT_ID(), чтобы получить идентификаторы первых двух вставок.

INSERT INTO tableA (data) VALUES (5); 
SET @idA = LAST_INSERT_ID(); 
INSERT INTO tableB (data) VALUES ('f'); 
SET @idB = LAST_INSERT_ID(); 
INSERT INTO tablAB(aId, bId) VALUES (@idA, @idB); 

Вы можете положить это все в хранимую процедуру.

+0

Я забыл про' LAST_INSERT_ID() ', спасибо за ваш ответ – yanman1234

1

Вы не можете сделать это в одном запросе.

Но вы могли бы использовать вместо TRANSACTION:

START TRANSACTION; 
    INSERT INTO tableA(data) VALUES(5); 
    SET @aid = LAST_INSERT_ID(); 
    INSERT INTO tableB(data) VALUES('f'); 
    SET @bid = LAST_INSERT_ID(); 
    INSERT INTO tableAB(aId, bId) VALUES(@aid,@bid); 
COMMIT; 

LAST_INSERT_ID() возвращает идентификатор ранее вставленной строки. Затем он сохраняется в пользовательской переменной с использованием SET и поэтому может ссылаться на следующие утверждения.

+0

Разве это не так, как ответ @ Barmar, за исключением управления откатом? кажется, в частности, на мой вопрос, ваш ответ и его функциональность одинаковы. – yanman1234

+0

@ yanman1234 Он отправил всего пару минут после меня, поэтому он мог бы работать над этим в одно и то же время. – Barmar

+0

И используя транзакцию для связанных запросов, таких как это хороший идеал а. – Barmar

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