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

今日のチャンネル#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」に違反しています

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

Source: https://habr.com/ru/post/J97378/


All Articles