键和约束
1.约束是一种限制,把约束放置在列级别或者表级别,确保数据满足一定的数据完整性
2.三种级别约束:实体约束,域约束,引用完整性约束
PRIMARY KEY约束;
FOREIGN KEY约束;
UNIQUE约束;
CHECK约束;
DEFAULT约束;
规则;
默认值;
3.实体约束:关于单独的行,要求所有行的某个列或者列的组合具有唯一值的约束;如PRIMARY KEY,UNIQUE约束
域约束:涉及一个或多个列,它确保某一个列或一组列满足特定的标准;如CHECK约束,规则,默认值和DEFAULT约束
引用完整性约束
4.约束的名字要保持一致,名字能为人所理解,名字在满足以上的前提下,尽可能的短
5.表中创建主键的方式:直接在创建表时,在列名后添加PRIMARY KEY;
ALTER TABLE <表名> ADD CONSTRAINT PK_EmployeeID PRIMARY KEY(<列名>)
6.外键约束
定义外键的表(引用表) 和 外键引用的表(被引用的表)创建依赖关系;
创建了外键约束后,插入引用表中的任何记录都必须在被引用表的被引用列上有匹配记录,否则,必须将外键列设置为NULL;
在创建时:<列名><数据类型><是否可空> FOREIGN KEY<列名> REFERENCES <表名>(<列名>)
在CREATE中可以省略FOREIGN KEY 子句,直接写REFERENCES子句
在修改时:ALTER TABLE <引用表名1> ADD CONSTRAINT <外键名> FOREIGN KEY (字段名1) REFERENCES <被引用表名2>(字段名2和1相同)
注意:主键列和外键列可以在同一列上
7.运行sp_help信息的约束部分下面看到约束内容
想了解约束信息,可以用sp_helpconstraint<表名>
8.表自引用,在实际添加自引用约束之前,很重要的一点是,在添加外键前至少要向表中加入一个行
9.级联操作
CREATE TABLE <表名>
(
字段名1 数据类型 <是否为空>,
字段名2 数据类型 <是否为空>,
字段名3 数据类型 <是否为空>,
字段名4 数据类型 <是否为空>,
CONSTRAINT 约束名1
PRIMARY KEY (字段名1,字段名2...字段名n),
CONSTRAINT 约束名2
FOREIGN KEY (字段名3)
REFERENCES 表2(被引用列)
ON UPDATE NO ACTION --子行不采取任何操作
ON DELETE CASCADE --子行采取相同的操作
)
10.其他级联操作
SET NULL
SET DEFAULT
如果执行的更新改变了行的父值,那么子行将被设置为NULL或该列上的默认值
11.UNIQUE约束
常被称为:备用键
最多可以插入一个NULL值,虽然NULL值不等于另一个NULL值,在UNIQUE约束看来,它们仍然是重复的。
添加方法1:直接在列后加UNIQUE;
添加方法2:ALTER TABLE <表名> ADD CONSTRAINT 约束名 UNIQUE(列名)
12.CHECK约束
几乎所有能放在WHERE子句中的事情都可以放在CHECK约束中,而且CHECK约束比其它类似的东西(触发器,规则)快的多
ALTER TABLE <表名> ADD CONSTRAINT 约束名 CHECK(约束条件)
13.DEFAULT约束
用以处理默认值
默认值只在INSERT语句中使用,UPDATE,DELETE将会忽略默认值;
如果INSERT语句中给出了值,则不使用默认值;
如果INSERT语句没有提供值,则会使用默认值;
注意:例外,对于UPDATE命令不使用默认值这一规定,就是在UPDATE 命令不使用默认值这一规则上,当明确使用默认值时,可以通过DEFAULT关键字作为想要更新的列的值来实现。
添加方法1:直接在列名后添加 DEFAULT 约束条件
添加方法2:ALTER TABLE <表名> ADD CONSTRAINT <约束名> DEFAULT <约束条件> FOR <字段名>
14.禁用约束
原因:创建约束时,已经存在数据库中的数据;
已经创建完约束后,想要加入到数据库中的数据;
不能够禁用PRIMARY KEY或者UNIQUE约束;
15.创建约束时忽略不正确的数据:
添加约束但是不把约束应用到现有的数据上,可以在执行ALTER TABLE语句添加约束时使用WITH NOCHECK
ALTER TABLE <表名> NOCHECK CONSTRAINT <约束名>
启用约束只需要将NOCHECK改为CHECK即可
16.规则和默认值:约束的同类
规则和默认值不是ANSI兼容的,这会造成移植问题,并且,他们的执行也和约束不一样
规则和默认值:是独立定义地对象,然后再绑定到表上
而约束是定义在表定义当中的。
17.规则的定义;
CREATE RULE <规则名> AS @变量名 <条件>
激活规则:
使用一个特殊的存储过程:sp_bindrule
sp_bindrule<'规则名'>,<'绑定到的对象'>, [<'futureonly_flag'>]
futureonly_flag参数只在将规则绑定到用户定义数据类型才会使用,默认是关闭的,如果设置为TRUE或者1,则绑定规则只会应用到绑定用户数据类型的心列上。
删除规则:
DROP RULE <规则名>
18.默认值是 基于对象的默认值
而DEFAULT约束不是基于对象的,是表内定义地完整部分
创建默认值:
CREATE DEFAULT <默认名>
AS <默认值>
使用sp_bindefault存储过程来绑定默认值:
EXEC sp_bindefault <'默认值名'>,<'绑定到对象'>
使用sp_unbindefault来取消默认值的绑定:
EXEC sp_unbindefault '<绑定对象>'
注意,默认值的存储过程也能用到futureonly_flag参数
删除默认值:
DROP DEFAULT<默认值>
19.确定那个表或者数据类型上使用了指定的规则和默认值
EXEC sp_depends<对象名>
该存储过程根据你请求的获得信息的对象,给出依赖于该对象的所有对象的列表
注意:权衡这些约束和触发器,键,规则,默认值的使用