一、约束
1、非空约束:NOT NULL
2、唯一约束:UK(UNIQUE KEY)
3、主键约束:PK(PRIMARY KEY ),PK=唯一约束+非空约束
4、检查约束:UK(FOREIGN KEY ),插入或更新数据时如果值不满足条件(如年龄设为1000),则报错。如果不是必须,不要设置太多检查约束,会导致数据更新效率下降
5、外键约束:FK(CHECK KEY ),定义在两个表之中,指两个表关系的配置,可以理解为父表子表关系
如下新建一张班级表,包含学号,姓名,性别:
CREATE TABLE class(
cid NUMBER ,
name VARCHAR2(30) NOT NULL,
age NUMBER(3),
sex VARCHAR2(20),
CONSTRAINT cid_pk PRIMARY(mid),
CONSTRAINT age_ck CHECK(age BETWEEN 0 and 200),
CONSTRAINT sex _ck CHECK(sex IN('男','女'))
);
mid_pk为主键的命名的名称,age_ck,sex_ck为检查约束两个名称
定义一张书表,书的拥有者对应一个学生
CREATE TABLE book(
bid NUMBER,
title VARCHAR2(20) NOT NULL,
cid NUMBER,
CONSTRAINT bid_pk PRIMARYKEY(bid), --主键
CONSTRAINT cid_fk FOREIGNKEY(cid) REFERENCES class(cid) ON DELETE CASCADE --外键,级联删除
);
book表中的cid字段的值由class中的cid来决定,可以为空,若取值不在class表中cid值,则报错违反完整约束条件。
注意外键约束带来的问题
1.、要先删除子表后才能删除父表,也可不管不顾强制删除 DROP TABLE class CASCADE CONSTRAINT,但是我们一般尽可能先删除子表,再删除父表。
2、子表中设置为外键的字段在主表中必须设置为主键或唯一约束
3、数据层次的麻烦之解决
级联删除操作(ON DELETE CASCADE):删除父表数据的时候,利用级联删除操作把子表的数据也删除
级联数据更新(ON DELETE NULL):删除父表数据,对应子表数据中外键值设为空
开发之中是否使用级联关系,需根据具体业务定义的。
二、约束修改
1、设置主键约束,如将mid字段设置为主键
ALTER TABLE class ADD CONSTRAINT cid_pk PRIMARYKEY(mid);
2、非空约束的修改
ALTER TABLE class MODIFY(name VARCHAR2(30) NOT NULL)
如果报错,需将错误数据删除(为空的)
3.、删除主键约束
ALTER TABLE class DROP CONTRAINT cid_pk
4、删除非空约束不能如上,需 使用"user_cons_columns"数据字典表,从里面找到非空约束的对象名称,而后才可以删除。
查出对象名称:select * from user_cons_columns;
删除:ALTER TABLE class DROP CONTRAINT 对象值
总结:约束最好在新建表的时候设置好,不要中途再修改表结构和约束。