2010-12-29 13 views
1

誰でもPostgresの構文の問題を助けることができますか?レコードを挿入しようとしていますが、その前に、それが存在しないことを確認するために、WHERE... ANDを使用してください。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 

OK、私たちはmanor_id=22398place_id=13621とレコードがないことを知っています。

=# 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 

私の構文には何が問題なのでしょうか?

答えて

3

このお試しください:ところで

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

を、より良いアプローチは、列のペアに一意制約を使用することです。これにより、行がすでに存在する場合に挿入が失敗します。

+1

SELECTの条件とUNIQUE制約には大きな違いがあります。条件は一意性を全く提供しませんが、異なるトランザクションは同じ瞬間に同じデータを挿入できます。 –

0

UNIQUE制約が必要です。SELECTはまだコミットされていないデータを見ることができないため、SELECTは役に立ちません。異なる取引では、同じ瞬間に新しいレコードを挿入することができ、これらはすべて「一意」です。