【问题标题】:Automatically update MySQL association table that has an auto increment foreign key自动更新具有自增外键的 MySQL 关联表
【发布时间】: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 的逻辑可以分离到触发器或与用于更新父表的语句不同的语句中,我想会有一个好处。

编辑:对 cme​​ts 的回应。

【问题讨论】:

  • A中的每条记录和B中的每条记录在AB中是否总是至少有一条记录?
  • 明确一点,你有三个表 A、B 和 A_B,对吧?
  • 顺便说一句,除非您使用单个 SQL INSERT 语句(不太可能),否则不能“同时”插入两个表。一个总是在另一个之前发生。
  • 另外,A的主键也是自增值吗?
  • @toonice 1) 是,2) 不是。更新了帖子以澄清。

标签: mysql sql database innodb


【解决方案1】:

在用于将数据插入A 和B 的语句之前放置以下语句...

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

此时会在B 中找到id_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 表示这个值。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 2019-06-26
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    相关资源
    最近更新 更多