仅允许在postgresql列中使用特定的值

时间:2019-03-21 19:51:12

标签: postgresql constraints

仅允许在postgresql列中使用特定值的正确方法是什么?

说我有一个名为 colors 的列,varchar数据类型带有NOT NULL约束。我只想允许新行的值为White,Blue或Black。也许它们是产品,我们只制造那些特定的颜色。

通过使用CHECK (color in("White", "Blue", "Black"))

是实现此目标的合适方法

有什么办法可以使列始终全部大写或小写,以便我不必担心Blue vs blue?是通过

处理该问题的最佳方法
ALTER TABLE test_table ADD CONSTRAINT CHECK (color = lower(color));

确保颜色条目的所有新行都是小写的正确方法是吗?显然,我需要将上面的颜色更新为“蓝色”,等等。

2 个答案:

答案 0 :(得分:0)

array_fill_keys

仅此而已。
单引号,而不是双引号。
不必担心大写,而只允许使用这三个小写单词。

您可能会考虑指向查询表的enumforeign key列。

答案 1 :(得分:0)

如果您有一组已知的值(又名枚举),则应改用enum type,这样不仅可以强制执行这些值,还可以强制执行大小写,并且具有减少磁盘上存储空间的优势。以及内部索引,例如:

CREATE TYPE my_color AS ENUM ('White', 'Blue', 'Black');

CREATE TABLE my_table (
    ...
    color my_color,
    ...
);

对于检查约束版本(如果您拥有不断扩展/动态的值集),您已经找到了最好的变体。