Postgresql
檢查數組列的約束以驗證長度 > 0
我正在使用 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)