テストは意味がありません。where 句に「テスト」を含めるだけです。
INSERT INTO silly_table(the_text)
'literal_text'
WHERE NOT EXISTS (
SELECT *
FROM silly_table
WHERE the_text = 'literal_text'
);
ここで、必要な場合にのみテストを行います。ステートメントの最後に行が存在します。tryというものはありません。
テストが意味をなさないことを理解していない人にとっては、テスト後の状況がテスト後に変化することが許されない場合、テストは意味があります。これには、テストとロックのシナリオが必要です。または、さらに悪いことに、トランザクション内のテストです。
更新: 動作するバージョン (基本的に同じ):
DROP TABLE exitsnot CASCADE;
CREATE TABLE exitsnot
( id SERIAL NOT NULL PRIMARY KEY
, val INTEGER -- REFERENCES something
, str varchar -- REFERENCES something
);
INSERT INTO exitsnot (val)
SELECT 42
WHERE NOT EXISTS (
SELECT * FROM exitsnot
WHERE val = 42
);
INSERT INTO exitsnot (str)
SELECT 'silly text'
WHERE NOT EXISTS (
SELECT * FROM exitsnot
WHERE str = 'silly text'
);
SELECT version();
出力:
DROP TABLE
NOTICE: CREATE TABLE will create implicit sequence "exitsnot_id_seq" for serial column "exitsnot.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "exitsnot_pkey" for table "exitsnot"
CREATE TABLE
INSERT 0 1
INSERT 0 1
version
----------------------------------------------------------------------------------------------
PostgreSQL 9.1.2 on i686-pc-linux-gnu, compiled by gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3, 32-bit
(1 row)