Postgresql

檢查數組列的約束以驗證長度 > 0

  • August 19, 2017

我正在使用 postgres 表驗證規則並嘗試CHECK為數組列設置約束。一個想法是只允許長度 > 0 的數組。

這是我想要實現它的方式:

create table words_table (
 id serial primary key, 
 words varchar(20)[] CHECK (array_length(words, 1) > 0)
);

但看起來它不起作用。o_o

insert into words_table (words) values ('{}');
//INSERT 0 1

如何實施這樣的約束?

array_length(words, 1)``null如果指定的數組維度不存在,將返回。您應該cardinality()改用:

create table words_table 
(
 id serial primary key, 
 words varchar(20)[] CHECK (cardinality(words) > 0)
);
insert into words_table (words) values ('{}');

結果是:

ERROR: new row for relation "words_table" violates check constraint "words_table_words_check"
 Detail: Failing row contains (1, {}).

引用手冊,您可能不知道的關鍵點:

應該注意,如果檢查表達式的計算結果為true 或 null 值,則滿足檢查約束。

大膽強調我的。

使用cardinality()修復這種情況,如 a_horse 解釋

明確禁止空數組會做同樣的事情,更便宜:

CHECK (words <> '{}')

兩種解決方案仍然允許它words本身為 NULL。您可能想要添加一個NOT NULL約束。

無論哪種方式,請注意 NULL總是通過CHECK約束。禁止表達式為 NULL 的一般解決方案:

CHECK (<expression> IS TRUE)

引用自:https://dba.stackexchange.com/questions/183891