部分インデックストリック

今日のチャンネル#postgresqlでは 、非常に興味深い質問が提起されました(読みやすくするために変更されました)。



テーブルに制約を作成する必要があります。 制約は、文字列と論理の2つのフィールドの一意性を検証する必要があります。 ただし、追加の要件があります。 文字列と値がTRUEのエントリは1つのみ許可されます。 同時に、特定の文字列で複数のレコードが許可されますが、値はFALSEです。 たとえば、{"abc"、false}が複数ある場合もありますが、{"abc"、true}は1行のみです。




さて、このタスクの重要性は何ですか? これは、 PostgreSQLの柔軟性を利用した非常に良い例です。PostgreSQLには、部分インデックスのメカニズムが備わっています。 ソリューションはシンプルでエレガントです:



CREATE TABLE foo(bar TEXT 、bing BOOLEAN );



foob​​ar(bar、bing)でのユニーク インデックス baz_indexの作成WHERE bing = 't' ;



foob​​arの値に 挿入'1''t' );

foob​​arの値に 挿入'2''t' );

foob​​arの値に 挿入'1''f' );

foob​​arの値に 挿入'1''f' );

foob​​arの値に 挿入'1''t' );

エラー:キー値の重複が一意制約「baz_index」に違反しています



独創的なものはすべてシンプルです。 それだけです!



All Articles