【发布时间】:2017-03-28 05:38:46
【问题描述】:
我有一个应用程序,其中特定事件将我的数据库与INSERTs 更新为两个表A 和B。还有一个附加的关联/链接表AB 与外键id_A、id_B 到A 和B 映射它们的多对多关系。我的问题是当应用程序逻辑不知道其中一个外键时如何最好地更新AB(在这种情况下,因为它是一个AUTO_INCREMENT ID)。
其他细节:
- 只有
id_B被设置为AUTO_INCREMENT,所以在插入之前它的值是未知的。 -
B更新为多行INSERT;A是单行INSERT。 -
id_B是唯一键,但可能存在重复项,由ON DUPLICATE KEY UPDATE处理,它将旧值替换为新值。 -
A和B在同一事务中更新以响应同一事件。 - 使用 InnoDB 的 MySQL 5.7。
我的想法是将所有插入语句包含在存储过程中,其中最终的 INSERT 到 AB 将从 LAST_INSERT_ID() 获取 id_B 的值,但显然这只会返回第一行的值在多行插入中:https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id
如果更新AB 的逻辑可以分离到触发器或与用于更新父表的语句不同的语句中,我想会有一个好处。
编辑:对 cmets 的回应。
【问题讨论】:
-
A中的每条记录和B中的每条记录在AB中是否总是至少有一条记录?
-
明确一点,你有三个表 A、B 和 A_B,对吧?
-
顺便说一句,除非您使用单个 SQL INSERT 语句(不太可能),否则不能“同时”插入两个表。一个总是在另一个之前发生。
-
另外,A的主键也是自增值吗?
-
@toonice 1) 是,2) 不是。更新了帖子以澄清。