- 使用CHECK约束时,当返回FALSE时,插入值将被拒绝,但是如果为NULL的话不会被拒绝,需要非常小心返回NULL值的情况
- 在数据库术语中,候选键用来描述列或者列的组合,这些列用来唯一标示一行数据,所有这些列都不允许为NULL;主键就是一个候选键,是用来唯一确定一行的主要方式;最好是为主键约束定义一个名称,而不是让SQL Server为主键定义名称;SQL Server内部会为主键约束创建索引
- UNIQUE约束要求只有一行可以为NULL,SQL Server内部会为UNIQUE约束创建索引,和其他约束一样,最好为UNIQUE约束定义一个名称,而不是让SQL Server去定义名称
- FOREIGN KEY必须引用主键列或者UNIQUE列,可以为NULL,最好为外键约束定义一个名称;当你添加外键约束时,SQL Server已经存在的数据,保证引用是合法的,如果在添加外键约束时指定了WITH NOCHECK选项,SQL Server不会检查已经存在的数据,只有在将来更新或者插入数据时才会检查外键约束
- 当你在一张表上添加外键约束时,你必须拥有目标表的REFERENCES权限,这样避免其他用户引用你的表,导致你无法删除或者修改自己的表,直到这个用户删除了引用为止;需要注意的是,为用户提供了REFERENCES,而没有提供SELECT权限,并不能阻止用户查看你表中的数据,因为用户可以暴力尝试所有值
- 外键约束包括一个CASCADE选项,用来指定级联引用完整性,定义当用户更新或者删除外键引用列时,采取的行为
- NO ACTION,返回错误并回滚操作
- CASCADE,将操作同步更新到引用表中,即如果是删除操作的话,引用表中的数据页会被删除,如果是更新操作的话,引用表中的外键也会被更新
- SET NULL,执行更新操作时,将引用表中的外键列置为NULL
- SET DEFAULT,执行更新操作时,将引用表中的外键列置为默认值
- 约束考虑:
- 不仅仅在数据库中执行数据检查,在其他层也要执行数据检查,并且要保证各层数据检查的一致性
- 当执行批量数据加载或者更新时,禁用约束会获取更好的性能
|