选择从插入到

时间:2016-03-29 16:35:50

标签: mysql sql

我有三个数据表,tableAtableBtableAB。内容并不重要,只有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,但每个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"))));

我真的不确定单个查询中的多个插入是否可行,并且不知道如何在上面编写它。

2 个答案:

答案 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);

您可以将这一切都放入存储过程中。

答案 1 :(得分: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将其存储在用户变量中,从而可以在以下语句中引用。