我有三个数据表,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 :(得分: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
将其存储在用户变量中,从而可以在以下语句中引用。