1、关系型数据库里一般有5种约束:主键约束、唯一键约束、外键约束、CHECK约束、NULL约束、DEFAULT(从系统视图来看,default也被SQLServer当成约束来管理);2、主键约束和唯一键约束会自动创建一个对应的索引;3、单独定义在某一列上的约束被称为列级约束,定义在多列上的约束称为表级约束;4、有外键的表,插入数据会失败,耦合度太高,所以外键一般不适用;
1、主键约束
(1)在表中的一列或者多列(联合主键)上,定义主键来唯一标识表中的数据行;
(2)主键约束要求键值唯一且不能为null,字段的属性必须是not null,才能创建主键,不然会报错;
(3)主键约束 = 唯一约束 + 非空约束;(4)一张表只能有一个主键,并且创建主键后,就会生成一个聚集索引;
2、唯一键约束
(1)唯一约束和主键约束的区别就是允许为null,所以创建的字段不用非得是not null;(2)唯一键列仅可以有一行为null,因为有2个以上为null的话,就违背唯一约束的原则了;(3)创建唯一约束会相应的创建一个非聚集索引;
(4)也可以创建联合唯一约束,也称作唯一键;
3、外键约束
(1)外键约束指的是表中的一列或者多列,引用其他表的主键或者唯一键;
(2)从表和主表中要创建外键的字段,长度或小数位数必须一样(比如要是nvarchar(20)就都是nvarchar(20)),不然会报错;
(3)创建外键的主表和从表字段是否为null无所谓,比如主表字段not null ,从表字段为null,外键也可以创建成功;
(4)从表创建外键的时候,从表可以没有主键,这个不是必须的;
(5)如果表的主键被其他表创建为外键,那么主键不能直接删除,否则会报错,需要先删除从表的外键,再删除主表的主键;
(6)创建外键的脚本(可以是主表的主键或者唯一键)
a、从表的外键列是主表的主键
b、从表的外键列是主表的主键
(7)从表里的同一个列既可以为自己的主键,也可以定义为外键;
(8)不能将主表的主键或唯一键的部分列作为外键,必须是全部列一起使用;
(9)从表插入数据失败
解决办法:
(10)主表删除/更新数据出错
解决办法:
--先禁用外键或者删除从表中被引用的数据注:未被引用的表可直接被删除
(11)truncate或drop主表会报错,即使是禁用外键,操作也会失败,因为外键关系依然存在;需要先drop从表或者删除外键才能成功truncate或drop主表;
(12)一个表上可以创建多个多个外键,但是出于性能和耦合度的考虑,不推荐使用外键;
4、CHECK约束
(1)check约束用于限制列中值的范围;
(2)check约束通过逻辑表达式来判断数据是否满足条件,用来限制一列或多列的值的范围,从而来约束输入的内容;
(3)可以对单独的列定义约束,也可以对整个表定义约束来限制多个列;
(4)创建脚本
5、NULL约束
(1)用于控制列是否允许为null;
(2)SQLServer中的聚合函数是会忽略null值的;
(3)字符型的字段,如果not null,那这个字段不能为null值,但是可以为空值‘’,意思是空字符串,和null值是不一样的;