1.check约束的创建语法
语法:
ALTER TABLE table_name
ADD CONSTRAINT check_name
CHECK ( check_condition ) [ NOT VALID] [ NO INHERIT];
table_name 是约束所在的表名,可以有模式名修饰;
check_name 是本约束的名称;
check_condition 是本约束的检查条件;
NOT VALID可指定也可不指定。指定NOT VALID时,会在本约束创建时检查表table_name中的已有数据是否符合本检查约束,如果全部符合则可创建,否则本约束无法创建;不指定NOT VALID时,则不检查表中已有数据是否符合,可直接创建该约束。
NO INHERIT可指定也可不指定。指定NO INHERIT时,表table_name的子表不会继承该约束,子表中插入数据时不会检查是否符合本约束;不指定NO INHERIT时,表table_name的子表会继承该约束,子表中插入数据时会检查是否符合 。
对于表继承,子表中插入的数据也会插入到母表中;母表中插入的数据,不会插入到子表中。
2.SQL测试
create table parent (id int ,name varchar);--母表
create table child() inherits(parent);--子表
--在对子表插入数据时,也会检查是否符合母表的check约束(仅检查INHERIT的check约束)
ALTER TABLE parent ADD CONSTRAINT ck_id CHECK (id > 1) NOT VALID;
postgres=# insert into parent values(0,'lyy');
ERROR: new row for relation "parent" violates check constraint "ck_id"
error: Failing row contains (0, lyy).
postgres=# insert into child values(0,'lyy');
ERROR: new row for relation "child" violates check constraint "ck_id"
error: Failing row contains (0, lyy).
--创建check约束时是valid,那么会检查表中已有数据是否符合本约束,如果是NOT VALID则不会检查。
postgres=# insert into parent values(2,'lyy');
INSERT 0 1
postgres=# ALTER TABLE parent ADD CONSTRAINT ck_id2 CHECK (id > 2) NO INHERIT NOT VALID;
ALTER TABLE
postgres=# ALTER TABLE parent ADD CONSTRAINT ck_id3 CHECK (id > 2) NO INHERIT;
ERROR: check constraint "ck_id3" is violated by some row
--validate母表的check约束时,如果该约束是NO INHERIT,那么会先到字表中去检查?。。。,否则不检查子表。
postgres=# ALTER TABLE parent VALIDATE CONSTRAINT ck_id;
ALTER TABLE
postgres=# ALTER TABLE parent VALIDATE CONSTRAINT ck_id2;
ERROR: constraint "ck_id2" of relation "child" does not exist
--在对子表插入数据时,也会检查是否符合母表的check约束(不检查NO INHERIT的check约束)
--对子表中插入的数据,也在母表中插入;对母表中插入的数据不会在子表中插入。
postgres=# insert into child values(1,'lyy');
ERROR: new row for relation "child" violates check constraint "ck_id"
error: Failing row contains (1, lyy).
postgres=# insert into child values(2,'sss');
INSERT 0 1
postgres=# select * from child;
id | name
----+------
2 | sss
(1 row)
postgres=# select * from parent;
id | name
----+------
2 | lyy
2 | sss
(2 rows)