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()
,谢谢您的回答