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;
我有一个 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;