使用`INSERT ... SELECT ... WHERE NOT IN(..)`合并PostgreSQL中的两个表

时间:2012-10-31 23:24:57

标签: postgresql copy

所有

我正在尝试使用COPY TO命令在表中批量插入一些数据,而我似乎无法绕过唯一键错误。这是我的工作流程。

创建我想要移动到另一台服务器的数据转储

COPY (
  SELECT *
  FROM mytable
  WHERE created_at >= '2012-10-01')
    TO 'D:\tmp\file.txt'

在目标数据库中创建一个新的“temp”表,然后像这样复制数据。

COPY temp FROM 'D:\tmp\file.txt'

我现在想将数据从“temp”表移动到目标DBlike中的主表中。

 INSERT INTO master SELECT * FROM temp 
                WHERE id NOT IN (SELECT id FROM master)

这样运行正常,但没有插入任何内容,也没有更新字段。有没有人知道这里会发生什么? temp和master的模式是相同的。对此事的任何帮助都会很棒!我正在使用Postgresql 9.2

亚当

1 个答案:

答案 0 :(得分:1)

如果null列表中有IN值,就会发生这种情况。

在SQL中,进行比较时null的存在始终为false(您需要进行特殊的IN NULL测试才能获得匹配)。如果从null返回任何SELECT id FROM master值,则会导致整个列表不匹配,这会带来令人遗憾的后果。

查看此查询是否返回任何行:

SELECT id
FROM master
WHERE id is null;

如果没有,那么不是你的问题。

如果有值,则修复是从列表中排除null ID:

INSERT INTO master
SELECT *
FROM temp 
WHERE id NOT IN (SELECT id FROM master where id is not null)


另一件需要考虑的事情是没有插入任何值!

相关问题