sql完整性约束

课本中把完整性约束单独做成一章来讲解,所以之前写数据定义之基本表定义时说会放到后面讲。
完整性约束有三种:实体完整性,参照完整性,用户定义完整性。
最后会讲完整性约束命名子句,所以一共四个部分。
Part [实体完整性]
实体完整性即主码,用primary key定义。
可用两种方式:
列级约束:create table test (id int primary key);  只能选取一列作为主码;
表级约束:create table test (id int,name char(10),primary key(id,name));  可选多列作为主码;
  
Part [参照完整性]
参照完整性即外码,用foreign key(<列名>[,<列名>...]) references <表名>(<列名>[,<列名>..]);而且只能使用表级约束。
现在以上面那个截图中的表为参照,建立另一个表
  

 注意:外码一定参照主码(可以是其他表的主码,也可以时自己的),而且外码的列数一定要等于被参照表的主码列数。

 参照完整性中比较麻烦的是违约处理,即当对被参照表进行update/delete/insert操作会破坏参照完整性时,参照表赢告诉被参照表应该怎么做。

 所以参照表可以在定义外码时添加上on delete/update [<no action> / <cascade>]。

 看例子比较直观:

  

 其中no action 表示拒绝执行(为默认值),cascade表示级联操作。

Part [用户定义完整性]
书中的用户定义完整性有三种:列值非空(not null),列值唯一(unique),列值需满足条件表达式(check);
not null都是列级完整性约束,很好理解。
check和unique可以是列级,也可以是表级约束。
看例子很方便理解:
  

 除了这三种,现在的sql产品中很多都支持一个设置默认值的操作(default);

  

 如果不设置,默认为NULL(not null,primary key除外)。

Part [完整性约束命名子句]
完整性约束命名子句是用来给完整性约束命名,这样我们就可以通过该名称对完整性约束进行删除、增加操作。
通过对mysql和sqlite的测试发现两款产品对命名子句的支持很奇怪,所以这部分只供参考。
格式为:
constraint <完整性约束名> <完整性约束>
注意:通过测试发现mysql中只支持表级完整性约束命名子句,而sqlite都支持,但sqlite中对基本表的修改操作很有限(可见前面的帖子数据定义之基本表定义),所以基本没什么用。
看例子很容易理解:
  

  

 测试过程中发现,mysql中这样定义没有报错,但constraint C1 check(id<100)并没有起作用(消失了..),而且primary key也没有被命名为Pkey。

 过多的细节并没有研究,希望有懂得的盆友给点指点。

 

posted @ 2019-05-19 15:03  aPSYCHO  阅读(5171)  评论(0编辑  收藏  举报