2016-03-29 112 views
1

我有三個數據表,tableA,tableBtableAB。內容並不重要,只有tableAtableB有主鍵,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's,但每個bId將只有一個aId引用它。因此,aId可能不是指現有的bId's。我正在努力的大事情是: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()可以獲得前兩個插入的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()返回先前插入行的id。然後使用SET將其存儲在用戶變量中,從而可以在以下語句中引用。

+0

和@ Barmar的回答不一樣,除了回滾控制嗎?似乎,具體到我的問題,你的答案和他的功能是一樣的 – yanman1234

+0

@ yanman1234他只在我後幾分鐘發佈,所以他可以一直在這個工作。 – Barmar

+0

並使用交易的相關查詢這是一個很好的理想一個。 – Barmar