CHECK约束在表继承中的使用

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)


转载于:https://my.oschina.net/liuyuanyuangogo/blog/546600

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值