范围和空值的表约束

问题描述 投票:0回答:1

版本 PG PostgreSQL 16.3。

我需要根据值的范围“1,2,3,4”和 null 在表的几个字段上添加约束。

如果我们已经有 my_field4 填充了 1 或 2 或 3 或 4 的记录,那么我们不能再插入 my_field4 = null 的记录。 此外,如果我们有一条记录 my_field4 填写为 1,那么我们可以插入另一条记录,其值为 my_field4 = 2。

我这样做了,但该限制对于 my_field4 字段具有空值的记录不起作用。

ALTER TABLE sch.my_tbl ADD CONSTRAINT check_auto 
exclude  (field1  WITH =,field2 WITH =, field3 WITH =, my_field4 WITH =) WHERE ((my_field4 in(1,2,3,4,null)));

例如:

INSERT INTO sch.my_tbl (field1, field2, field3, my_field4) VALUES(1, 'two', 3, 1);--Should be OK
INSERT INTO sch.my_tbl (field1, field2, field3, my_field4) VALUES(1, 'two', 3, 2);--Should be OK
INSERT INTO sch.my_tbl (field1, field2, field3, my_field4) VALUES(1, 'two', 3, null);--Should be  unique constraint error
INSERT INTO sch.my_tbl (field1, field2, field3, my_field4) VALUES(2, 'text', 3, null);--Should be  OK
INSERT INTO sch.my_tbl (field1, field2, field3, my_field4) VALUES(2, 'text', 3, 1);--Should be  unique constraint error

我想禁止插入一条记录,其中 (f1,f2, f3) 对应于现有行,而 f4 只能为值 1,2,3,4 或 null 对于相同的值f1、f2、f3。 如果有录音的话 如何正确构造约束?

postgresql database-design constraints
1个回答
0
投票

您可以在字段上添加 UNIQUE 约束、NOT NULL 约束和 CHECK 约束。

CREATE TABLE my_table (
some_field INT UNIQUE NOT NULL 
CHECK (some_field = 1 OR some_field = 2 OR some_field = 3 OR some_field = 4)
)

附注如果以后想扩大可能值的范围,最好创建额外的表和外键。

© www.soinside.com 2019 - 2024. All rights reserved.