Mysql 从“插入到”中选择

Mysql 从“插入到”中选择,mysql,sql,Mysql,Sql,我有三个数据表,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 我想做的是将这三个表的插入合并到一个查询中,但不确定如何执行。我目前

我有三个数据表,
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)让一个
插入的值来自另一个
插入的值,2)在一个查询中模拟多个插入,用于
出价

当前查询:

insert into tableAB(aId, bId) 
values((select aId from(insert into tableA(data) values(5))), 
       (select bId from(insert into tableB(data) values("f"))));
我真的不确定在一个查询中可以进行多个插入,也不知道上面的编写方法。

使用
LAST\u INSERT\u 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);

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

您不能在一个查询中完成

但您可以使用
事务

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\u INSERT\u ID()
返回先前插入行的ID。然后使用
SET
将其存储在用户变量中,因此可以在以下语句中引用。

MySQL不支持在单个查询中插入多个表:(你可以在Postgres中做你想做的事情,但是MySQL不支持在一个查询中插入多个表。有一个最后的插入ID,请参阅,示例:
INSERT
查询不返回值,你不能在
SELECT
中将它们用作子查询。除了使用回滚控件之外,这与@Barmar的答案不一样吗,具体到我的问题,你的答案和他的答案在功能上是相同的same@yanman1234他在我之后几分钟就发了帖子,所以他可以在同一时间处理它。使用事务处理类似的相关查询是个好主意。我并不想让它听起来像是对抄袭或其他什么的指控,我只是想e如果在使用
事务
时他的答案有更多的内容,或者如果基本上两个答案都是等价的。我个人以前从未使用过
事务
,这就是我问的原因。当你使用
事务
时,你要确保在执行
提交
之前,没有任何更改是永久性的。如果你说服务器在第一个
INSERT
语句后崩溃。您不会在tableA中得到与tableB没有关系的行,而您的应用程序可能至少需要一个。您希望在一个查询中执行所有插入操作,因此我认为这正是您所寻求的行为。我忘记了
LAST\u INSERT\u ID()
,谢谢您的回答