2016-03-29 72 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