MySQL INSERT INTO inside UPDATE 和 SET new primary key as foreign key

MySQL INSERT INTO inside UPDATE and SET new primary key as foreign key

我有一个 table,其中一些引用的 datastores 已被删除,并且它们的外键引用为空。我需要插入一个新的 datastore 并在引用中设置外键 table.

所有 ID 都是 UUIDs,我的伪查询看起来像这样但不起作用:

UPDATE `rcachievements_player_achievements`
SET data_id = (INSERT INTO `rcachievements_datastore` (data) VALUES ('{"count":0}'))
WHERE data_id is null

有什么方法可以插入 datastore,然后在 data_id 字段中为缺少数据存储的每一行设置 id

您必须将其作为多个查询来执行。首先将新行插入 rcachievements_datastore,然后更新所有引用行。

SET @id = UUID();
INSERT INTO `rcachievements_datastore` (id, data) VALUES (@id, '{"count":0}');

UPDATE `rcachievements_player_achievements`
SET data_id = @id
WHERE data_id is null;

我最终用 FOR LOOP 完成了它,如下所示:

DELIMITER //

FOR i IN (SELECT id FROM `rcachievements_player_achievements` WHERE data_id is NULL)
DO
        SET @id = UUID();
        INSERT INTO `rcachievements_datastore` (id, data, version, when_created, when_modified) VALUES (@id, '{"count":0}', 1, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP());
        UPDATE `rcachievements_player_achievements` SET data_id = @id WHERE id = i.id;
END FOR;
//

DELIMITER ;

SELECT id FROM `rcachievements_player_achievements` WHERE data_id is NULL;