表的约束
一、数据的完整性
数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性
(Reliability),它是防止数据库中存在不符合语义规定的数据和防止因错误信
息的输入输出造成无效操作或错误信息而提出的。例如:
数据类型
年龄使用什么类型?
格式是否正确
身份证号,可以是15位也可以是18位
范围
性别可选择“男”、“女”、“未知”
是否允许重复
银行卡号不允许重复
特定业务要求
银行贷款
二、数据的完整性分类
1.实体完整性
实体完整性要求每一个表中的主键字段都不能为空或者重复的值。
实现方法:唯一约束
主键约束
2.域完整性
域完整性指列的值域的完整性。如数据类型、格式、值域范围、是否允许空值
等
实现方法:限制数据类型
外键约束
默认值
非空约束
3.引用完整性
也称之为参照完整性,当更新、删除、插入一个表中的数据时,通过参照引用
相互关联的另一个表中的数据,来检查对表的数据操作是否正确。
引用完整性要求关系中不允许引用不存在的实体。
引用完整性与实体完整性是关系模型必须满足的完整性约束条件。
实现方法:外键约束
4.自定义完整性
用户自定义完整性指针对某一具体关系数据库的约束条件,它反映某一具体应
用所涉及的数据必须满足的语义要求。
实现方法:存储过程
触发器
三、表约束
表约束的目的:确保表中数据的完整性
常用的约束类型:
1.主键约束(PRIMARY KEY)
要求主键列数据唯一,并且不允许为空
语法:
create table test1(
id int primary key, --这儿的primary key指定了id为主键
name varchar(30)
);
选择主键的原则:
最少性:尽量选择单个键作为主键,必须保证唯一
稳定性:尽量选择数值更新少的列作为主键
一般选择没有意义,且用户不关心,但程序员关心的列做为表的主键
可以使用系统的sys_guid作主键的值
可以使用自动增长的integer列做为主键的值(序列)
主键约束的特点:唯一、不可重复。
非空NULL。
其他特点:用户不关心。
对用户没有任何意义。但对程序开发人员,意义重大。
2.唯一键约束(UNIQUE)
Unique是唯一约束,也可称为候选键
要求该列唯一,允许为空,但可以保存两个null
Unique创建的约束列上,不可以存在相同的值。
语法:
create table test1(
id int unique, --这儿的unique指定了id为唯一
name varchar(30)
);
3.非空约束(NOT NULL)
当数据表中的某个字段上的内容不希望设置为null的时候,则可以使用NOT
NULL进行指定
语法:
create table test1(
id int not null, --这儿的not null指定了id为非空
name varchar(30)
);
4.默认约束(DEFAULT)
是指用户没有给定此列的值时,则使用默认值
语法:
create table test1(
id int,
age int default 0
);
5.检查约束(CHECK)
指定表中一列或多列可以接受的数据值格式
限制sex的取值
create table t4(
id int,
sex char(1) constraint sex_chk check(sex in('1','0'))
);
通过check约束区间
create table t5(
id int,
age int
);
限制年龄在0~100
alter table t5 add constraint t5_chk check (age>=0 and age<=100);
添加一个是检查,只可以写入以M开始的数据
alter table person add constraint p_ck check(name like 'M%');
可以通过constraint创建指定名称的约束
语法:
create table t4(
id int,
sex char(1),
constraint pk_id primary key(id)
);
非空和默认约束不适合
主外键约束和范式
1.范式:
第一范式:对于表中的每一行,必须且仅仅有唯一的行值.在一行中的每一列仅
有唯一的值并且具有原子性.
第二范式要求非主键列是主键的子集,非主键列活动必须完全依赖整个主键。
主键必须有唯一性的元素,一个主键可以由一个或更多的组成唯一值的列组成。
一旦创建,主键无法改变,外键关联一个表的主键。主外键关联意味着一对多
的关系.
第三范式要求非主键列互不依赖.
第四范式禁止主键列和非主键列一对多关系不受约束
第五范式将表分割成尽可能小的块,为了排除在表中所有的冗余.
2.主键与外键
主键与外键
主键与外键是维护多表关系的有效手段。
3.注意事项
当主表中没有对应的记录时,不能将记录添加到子表
不能更改主表中的值而导致子表中的记录孤立
子表存在与主表对应的记录,不能从主表中删除该记录
删除主表前,先删子表
E-R模型
E-R 模型的特点
Entities:实体
Attributes:属性
Relationships:关系
通常有许多表
通常是满足3NF的
主键/ 外键
一对多映射
建立E-R模型是数据库概念设计的重要内容,而概念设计是设计阶段的组成部分
。同时建立E-R模型的工作,属于软件生命周期的设计阶段。
6. 外键约束(FOREIGN KEY)
用于建立和加强两个表数据之间连接的一列或多列。 通过将表中的主键列添加
到另一个表中。可以创建两个表之间的连接。这个主键的列就称为第二个表的
外键。外键约束就可以确保添加到外键表中的任何行都在主表中都存在相应的
行
添加外键约束
创建主外键关系
create table person(
id varchar(32),
name varchar(30),
constraint p_pk primary key(id) );
创建外表
create table car(
id varchar(32),
name varchar(30),
pid varchar(32),
constraint c_pk primary key(id),
在创建外键约束时可以添加ON DELETE CASCADE选项,那么当主表的数据被删除
时,子表对应的行同样也自动被删除。例如
创建主外键关系且设置级联删除
create table p2(
id int,
nm varchar2(30),
constraint p2_pk primary key(id)
);
下面的on delete cascade就是删除时级联
create table c2(
id int,
nm varchar2(30),
pid int,
constraint c2_pk primary key(id),
constraint c2_fk foreign key(pid) references p2(id) on
delete cascade);
在创建外键约束时可以添加ON DELETE SET NULL选项,那么当主表的数据被删
除时,子表匹配的相关行的列会被设置为NULL值,而不是被删除
例如
设置外键
ALTER TABLE order_status2
ADD CONSTRAINT order_status2_modified_by_fk
modified_by REFERENCES employees(employee_id) ON DELETE SET NULL
四、表与表的关系
1.一对一
一对一的场景
一对一的实现方案:
主键对主键的一对一
主键对唯一的一对一
一对一的查询inner join,left join,right joing
2.一对多
一对多的场景
主键对外键的引用
一对多的查询
3.多对多
多对多的场景
多的多的实现
使用中间表实现多对多
多对多的查询
五、修改约束
1.删除约束
通过ALTER TABLE的DROP CONSTRAINT选项删除约束
ALTER TABLE 表名
DROP CONSTRAINT 约束名;
2.停用约束
约束在创建完之后就生效了,也可以在创建时在CONSTRAINT关键字末尾加
DISABLE关键字,默认停用它。
ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE (status) DISABLE;
也可以停用已经启用的约束
ALTER TABLE 表名 DISABLE CONSTRAINT 约束名;
3.启用约束
可以使用ALTER TABLE的ENABLE CONSTRAINT选项将已存在的约束失效启用。例
如
ALTER TABLE 表名 ENABLE CONSTRAINT 约束名;
说明
在启用约束时,表中所有的数据行的数据必须要满足这个约束。
也可以通过设置ENABLE NOVALIDATE,对新的数据行增加约束
ALTER TABLE 表名 ENABLE NOVALIDATE CONSTRAINT 约束名;
说明
默认是ENABLE VALIDATE,对存在的数据行也要求符合约束
4.延迟约束
延迟约束(Deferred Constraint)就是在事务提交的时候才生效
可以在约束中加DEFERRABLE选项
约束一旦创建之后就不能将其改为DEFERRABLE,必须删除重新创建
创建DEFERRABLE约束时,可以使用INITIALLY IMMEDIATE或INITIALLY DEFERRED
INITIALLY IMMEDIATE:表示添加、更新或删除时都进行数据的合法性验证(默
认情况)
INITIALLY DEFERRED:表示只有事务提交时,才进行数据的合法性验证
例如:
给order表的唯一约束设置成延迟的
先删除order表的唯一约束
ALTER TABLE order
DROP CONSTRAINT order_uq;
添加唯一约束
ALTER TABLE order
ADD CONSTRAINT order__uq UNIQUE (order_id)
DEFERRABLE INITIALLY DEFERRED;
六、查看约束信息
给order表的唯一约束设置成延迟的
先删除order表的唯一约束
ALTER TABLE order DROP CONSTRAINT order_uq;
添加唯一约束
ALTER TABLE order ADD CONSTRAINT order__uq UNIQUE (order_id)
DEFERRABLE INITIALLY DEFERRED;
七、查看列的约束信息
通过查看user_cons_columns视图,了解列的约束信息
视图相关列的说明
owner:约束的拥有者
constraint_name:约束名
table_name:约束所在的表
column_name:约束定义所在的列
SELECT owner,constraint_name,table_name,column_name
FROM user_cons_columns
WHERE table_name=‘T4';