我有一个应用程序,其中特定事件使用INSERT
将我的数据库更新为两个表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
会在同一个交易中更新以响应同一事件。我的想法是在存储过程中包含所有插入语句,其中最终INSERT
到AB
将从id_B
获取LAST_INSERT_ID()
的值,但显然这将是仅返回多行插入中第一行的值:https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id
如果更新AB
的逻辑可以分离成触发器或与用于更新父表的内容不同的语句,我认为可以获得奖励。
编辑:对评论的回应。
答案 0 :(得分:0)
在用于将数据插入A
和B
的陈述之前,请填写以下声明......
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
值。
如果您有任何问题或意见,请随时发表评论。