Postgres: ГДЕ ... И синтаксическая проблема - PullRequest
1 голос
/ 29 декабря 2010

Может кто-нибудь помочь с проблемой синтаксиса Postgres?Я пытаюсь вставить запись, но перед этим проверьте, что она не существует, используя WHERE... AND.

=# \d domes_manor_place;
 id       | integer | not null default nextval('domes_manor_place_id_seq'::regclass)
 manor_id | integer | not null
 place_id | integer | not null
=# select * from domes_manor_place where place_id='13621';                                                                            
 24017 |    22276 |    13621

ОК, поэтому мы знаем, что нет записей с manor_id=22398 и place_id=13621.Давайте попробуем вставить его с помощью нашего синтаксиса WHERE ... AND:

=# INSERT INTO domes_manor_place (manor_id, place_id) SELECT 22398, 13621                                                                 
WHERE (22398 NOT IN (SELECT manor_id FROM domes_manor_place)) AND                                                                             
(13621 NOT IN (SELECT place_id FROM domes_manor_place));
INSERT 0 0

Он не вставит запись - так что не так с моим синтаксисом?

Ответы [ 2 ]

3 голосов
/ 29 декабря 2010

Попробуйте это:

WHERE (22398, 13621) NOT IN (SELECT manor_id, place_id FROM domes_manor_place)

Кстати, гораздо лучший подход - использовать уникальное ограничение на пару столбцов.Это приведет к сбою вставки, если строка уже существует.

0 голосов
/ 29 декабря 2010

Вам нужно UNIQUE-ограничение, SELECT не может помочь, потому что он не может видеть данные, которые еще не зафиксированы.Различные транзакции могут вставлять новые записи в один и тот же момент, и все они «уникальны» ... НЕ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...