所有
我正在尝试使用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
亚当
答案 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)
另一件需要考虑的事情是没有插入任何值!