我已经搜索了所有内容,但无法找到答案。我有两个表格user_setting
和fibruser
,其中包含用户的ID 。 fibruser
包含所有可能的ID,但user_setting
仅包含一些ID。我需要将fibruser.id
复制到user_setting.user_id
,user_id
为NULL
,并确保不会覆盖现有的SELECT user_setting.user_id, fibruser.id
FROM user_setting
FULL JOIN fibruser
ON user_id = fibruser.id;
。
我这样做查询:
UPDATE user_setting
比较ID并查找所有ID,但我无法让UPDATE user_setting
SET user_id = fibruser.id
FROM fibruser
WHERE user_id IS null;
像我想的那样工作......
0 row(s) affected
这只给了我`UPDATE user_setting SET user_id = fibruser.id 来自fibruser WHERE user_id = id AND user_id为null;
这只输出id: INT(auto increment)
..我做错了什么和/或丢失了什么?
编辑:忘记提及数据类型。
user_id: INT
{{1}}
答案 0 :(得分:1)
当您执行FULL JOIN时,您看到的所有空值都代表了 在fibruser中具有给定ID值的行的情况,但是 NOT user_setting中具有该ID值的任何行。因此,当您在user_setting上执行UPDATE时,根据定义,您将有0行受影响;你明确告诉它只更新你知道不存在的行!
我认为你想要做的是插入这些行,如下所示:
INSERT INTO user_setting (user_id)
SELECT f.id
FROM fibruser f
WHERE f.id NOT IN (SELECT user_id FROM user_setting);
或者,您可以使用NOT EXISTS:
编写它INSERT INTO user_setting (user_id)
SELECT f.id
FROM fibruser f
WHERE NOT EXISTS (SELECT 1 FROM user_setting u WHERE f.id = u.user_id);
你可能会发现一种方式或另一种方式运行得更快,或者它们可能是相同的;但是,因为我假设你只是这样做了一次,所以你可能不太关心性能,所以你可以选择漂浮你的船的任何语法。