PostgreSQL中的WHERE NOT EXISTS语句会导致语法错误

8
当我尝试使用WHERE NOT EXISTS子句来防止在列age中添加重复值的行时,出现了错误syntax error at or near "WHERE"。为什么会出现语法错误?我正在使用Postgresql 9.1。 SQL
INSERT INTO live.users ("website", "age") 
values ('abc', '123')
WHERE NOT EXISTS (SELECT age FROM live.users WHERE age = 123);

错误

ERROR:  syntax error at or near "WHERE"
LINE 6: WHERE NOT EXISTS (SELECT age FROM live.users W...

如果您想要防止某一列中出现重复的值,那么最好的方法是在该列上添加“唯一约束(unique constraint)”。(例如:ALTER TABLE live.users ADD CONSTRAINT age_unique UNIQUE(age)) - Terje D.
4个回答

33

建议改为:

INSERT INTO live.users ("website", "age") 
SELECT 'abc', 123
WHERE NOT EXISTS (SELECT age FROM live.users WHERE age = 123);

4
INSERT INTO live.users ("website", "age") 
select 'abc', '123'
WHERE NOT EXISTS (SELECT age FROM live.users WHERE age = 123);

1

我注意到你要求的是v9.1版本,但现在距离那已经过去了4年。从PostgreSQL v9.5 - INSERT开始,你可以使用ON CONFLICT … DO NOTHING选项:

INSERT INTO live.users("website", "age") VALUES('abc', '123') ON CONFLICT ("age") DO NOTHING

值得注意的是,在目标表上设置相应的约束条件是必要的 - 但在大多数情况下,我想你应该已经做到了。否则你会得到这样的结果:
ERROR:  there is no unique or exclusion constraint matching the ON CONFLICT specification

0
我在使用PLPGSQL中遇到了一些问题,涉及WHERE field NOT EXISTS。相反,WHERE field NOT IN效果很好,在使用后没有收到任何函数错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接