入力をいくつかの異なる文字列に制限する


11

こんにちは私はpostgreSQLで期待どおりに制約が機能していないようです。pgadmin内から、次のSQLクエリを実行します。

-- Check: "TypeCheck"

-- ALTER TABLE "ComLog" DROP CONSTRAINT "TypeCheck";

ALTER TABLE "ComLog"
  ADD CONSTRAINT "TypeCheck" CHECK ("Type" SIMILAR TO 'email|post|IRL|minutes');
COMMENT ON CONSTRAINT "TypeCheck" ON "ComLog" IS 'One of email|post|IRL|minutes';

実行するとこれに変換されます。

-- Check: "TypeCheck"

-- ALTER TABLE "ComLog" DROP CONSTRAINT "TypeCheck";

ALTER TABLE "ComLog"
  ADD CONSTRAINT "TypeCheck" CHECK ("Type" ~ similar_escape('email|post|IRL|minutes'::text, NULL::text));
COMMENT ON CONSTRAINT "TypeCheck" ON "ComLog" IS 'One of email|post|IRL|minutes';

これにより、[タイプ]列への入力が、電子メールポストIRLまたは分に制限されると期待しています。ただし、テーブルデータを入力すると、これらのタイプの1つを入力すると、この制約が失敗します。タイプ列は文字タイプです。誰でもこれを修正する方法を知っていますか?ありがとう。


3
私が何かを理解していないのでなければ、読むのがそれほど簡単ではない理由はありますCHECK (type in ('email','post','IRL','minutes')か?
rfusca 2012

回答:


15

制約を次のように変更します

CHECK (type IN ('email','post','IRL','minutes'))

これは、パーサーによって次のように変換されます。

CHECK (type = ANY( ARRAY['email','post','IRL','minutes']))

それはあなたが見ていることをするはずです。

しかし、これを行う方が良いのではないかと思います。

CREATE TABLE comlog_types (
     type text
);

次に、外部キーを追加して制約を適用します。これにより、将来タイプを追加しやすくなります。


おかげで、それで完全に解決しました。将来、外部キー方式に変更することを検討するかもしれません。
wookie1 2012

2
ええ、それはうまくいきます。ただし、PostgreSQLのenumデータ型を確認することもできます。
XåpplI'-I0llwlg'I -
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.