自动更新具有自动增量外键的MySQL关联表

时间:2017-03-28 05:38:46

标签: mysql sql database innodb

我有一个应用程序,其中特定事件使用INSERT将我的数据库更新为两个表AB。还有一个额外的关联/链接表AB,其中包含映射其多对多关系的外键id_Aid_BAB。我的问题是如何在应用程序逻辑不知道某个外键时更新AB(在这种情况下,因为它是AUTO_INCREMENT ID)。

其他详情:

  • 只有id_B设置为AUTO_INCREMENT,因此在插入前不知道其值。
  • B使用多行INSERT进行更新; A是一行INSERT
  • id_B是一个唯一键,但有些重复项由ON DUPLICATE KEY UPDATE处理,用新值替换旧值。
  • AB会在同一个交易中更新以响应同一事件。
  • MySQL 5.7使用InnoDB。

我的想法是在存储过程中包含所有插入语句,其中最终INSERTAB将从id_B获取LAST_INSERT_ID()的值,但显然这将是仅返回多行插入中第一行的值:https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id

如果更新AB的逻辑可以分离成触发器或与用于更新父表的内容不同的语句,我认为可以获得奖励。

编辑:对评论的回应。

1 个答案:

答案 0 :(得分:0)

在用于将数据插入AB的陈述之前,请填写以下声明......

SET @before = ( SELECT MAX( id_B ) AS maxIDB
                FROM B );

目前,这会在id_B中找到B的最大值。随后插入B的所有值都将大于此值。我们可以利用这一事实。

在上面提到的插入语句之后发出以下声明......

INSERT INTO AB ( id_A,
                 id_B )
SELECT id_A_value,
       B.id_B
FROM B
WHERE B.id_B > @maxIDB;

注意:根据您的上述问题,我假设id_A已知。我用id_A_value表示此值。

此语句将插入AB行,其中包含已知值id_A和所有新生成的id_B值。

如果您有任何问题或意见,请随时发表评论。