【发布时间】:2021-06-15 13:38:09
【问题描述】:
给定类似这样的 MySQL 表1:
alpha (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
, beta_id INT NULL
, type_info INT NOT NULL
, CONSTRAINT fk_alpha_beta FOREIGN KEY (beta_id) REFERENCES beta (id)
) ENGINE=InnoDB;
beta (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
, type_info INT NOT NULL
) ENGINE=InnoDB;
我的 alpha 表包含很多行,我想在表 beta 中创建相应的行,并将 ID 存储在 alpha.beta_id 列中。
我可以像这样一次性在 beta 中创建行:
INSERT INTO beta (type_info)
SELECT type_info FROM alpha
WHERE beta_id IS NULL;
如何才能将生成的 beta id 放入 alpha 中相应行的 beta_id 列?
测试版中的行没有独特的特征,无法让我回顾性地识别它们。
如果我只创建一行,我可以使用类似的东西:
UPDATE alpha
SET beta_id=LAST_INSERT_ID()
WHERE beta_id IS NULL;
但这似乎不能推广到多行。
This question 有点相似,但它使用的是INSERT ... VALUES,不适用于INSERT ... SELECT 的用例。
This question 有类似的要求,我知道我可以使用ROW_COUNT 查看插入了多少行,但这并没有给我添加的行和它们创建的 alpha 行之间的对应关系为。
我只剩下编写一个非 SQL 脚本,该脚本将提取所有信息,一次创建一个 beta 行,然后单独更新 alpha 中的行。但我更愿意在 SQL 中执行此操作,这似乎是一个相当明显的用例。
1.显然我们的实际模式要复杂一些,但我试图将其归结为演示问题所需的信息。
【问题讨论】: