将列复制到另一个表,但保持相同的ID

时间:2014-03-20 13:40:22

标签: sql postgresql

我已经搜索了所有内容,但无法找到答案。我有两个表格user_settingfibruser,其中包含用户的ID 。 fibruser包含所有可能的ID,但user_setting仅包含一些ID。我需要将fibruser.id复制到user_setting.user_iduser_idNULL,并确保不会覆盖现有的SELECT user_setting.user_id, fibruser.id FROM user_setting FULL JOIN fibruser ON user_id = fibruser.id;

我这样做查询:

UPDATE user_setting

enter image description here

比较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}}

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);

你可能会发现一种方式或另一种方式运行得更快,或者它们可能是相同的;但是,因为我假设你只是这样做了一次,所以你可能不太关心性能,所以你可以选择漂浮你的船的任何语法。

相关问题