2013-04-05 43 views
5

Khi cố gắng sử dụng mệnh đề WHERE NOT EXISTS để tránh thêm hàng có giá trị trùng lặp trong cột age, tôi nhận được lỗi syntax error at or near "WHERE".KHÔNG CÓ TÌNH TRẠNG trong PostgreSQL cho lỗi cú pháp

Tại sao nó lại xảy ra lỗi cú pháp? Tôi đang sử dụng Postgresql 9.1.

SQL

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

Lỗi

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

Nếu bạn muốn ngăn các giá trị trùng lặp trong một cột, sẽ tốt hơn nếu thêm một 'ràng buộc duy nhất' vào cột đó. (ALTER TABLE live.users THÊM LỆNH age_unique UNIQUE (tuổi)) –

Trả lời

25

Do thay vì:

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

cảm ơn rất hữu ích .. –

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

tôi encountere d một số vấn đề khi sử dụng WHERE field NOT EXISTS trong PLPGSQL. Thay vào đó những gì làm việc tốt là WHERE field NOT IN, tôi không nhận được lỗi chức năng nào sau khi sử dụng.

0

Tôi thấy bạn hỏi cho v9.1 nhưng nó được 4 tuổi từ và bây giờ, bắt đầu từ PostgreSQL v9.5 - INSERT cung cấp cho bạn tùy chọn ON CONFLICT … DO NOTHING:

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

Worth lưu ý này đòi hỏi tương ứng hạn chế thiết lập trên bảng mục tiêu - nhưng trong hầu hết các trường hợp, tôi tưởng tượng bạn sẽ có nó. Nếu không, bạn sẽ nhận được:

ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification 
Các vấn đề liên quan