一、概述
1.分类
表级约束主要分为以下几种:
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
2.注意事项
如果不指定约束名 ,Oracle server 自动按照 SYS_Cn 的格式指定约束名
创建和修改约束: 建表的同时 建表之后
可以在表级或列级定义约束
可以通过数据字典视图查看约束
3.建立约束的方式
列级:column [CONSTRAINT constraint_name] constraint_type,
表级:column,... [CONSTRAINT constraint_name] constraint_type (column, ...),
二、非空约束——NOT NULL
在定义表DDL时直接添加:
CREATE TABLE emp3(
id NUMBER(32) NOT NULL,
name VARCHAR2(10) CONSTRAINT emp3_name_nn NOT NULL
)
1.注意单词constraint的写法;
2.可以采用自定义命名约束(一般用 表名_列名_约束名的形式),若省略,则采用系统命名
三、唯一约束——UNIQUE
注意以下两种添加约束的写法:
CREATE TABLE emp4( id NUMBER(32) UNIQUE, name VARCHAR2(10), CONSTRAINT emp4_name_uk UNIQUE(name) )
1.唯一约束中是允许出现NULL值的
2.允许出现多个NULL值
// 建议采用给约束命名的方式进行管理约束
四、主键约束——PRIMARY KEY
根据主键的定义,主键约束自动拥有:唯一非空约束
CREATE TABLE emp5(
id NUMBER(32),
name VARCHAR2(10),
CONSTRAINT emp4_id_pk PRIMARY KEY(id)
)
// 主键用于唯一确定一条记录
五、外键约束——FOREIGN KEY
参照其他列的主键,称为外键(外键的值必须在参考列存在)
CREATE TABLE emp6(
id NUMBER(32),
name VARCHAR2(10),
CONSTRAINT emp4_id_fk FOREIGN KEY(id) REFERENCES emp5(id)
)
外键可选项:
FOREIGN KEY: 在表级指定子表中的列
REFERENCES: 标示在父表中的列
ON DELETE CASCADE(级联删除): 当父表中的列被删除时,子表中相对应的列也被删除
ON DELETE SET NULL(级联置空): 子表中相应的列置空
示例:
CREATE TABLE emp6(
id NUMBER(32),
name VARCHAR2(10),
CONSTRAINT emp4_id_fk FOREIGN KEY(id) REFERENCES emp5(id) ON DELETE CASCADE
)
六、检查约束——CHECK
定义必须满足的条件的约束
CREATE TABLE emp7(
id NUMBER(32),
name VARCHAR2(10),
CONSTRAINT emp7_id_ck CHECK(id > 1000 AND id < 2000)
)
七、约束管理
都是基于ALTER TABLE进行管理的!
1.添加约束
ALTER TABLE table ADD [CONSTRAINT constraint] type (column);
示例:
ALTER TABLE emp7 ADD(CONSTRAINT emp7_name_pk PRIMARY KEY(name))
添加NOT NULL约束需要使用MODIFY关键字:
Alter table emp modify(empname varchar2(50) not null);
2.删除约束
ALTER TABLE employees
DROP CONSTRAINT emp_manager_fk;
// 所以说自定义命名约束便于管理
3.无效化约束
ALTER TABLE employees
DISABLE CONSTRAINT emp_emp_id_pk;
4.激活无效的约束
ALTER TABLE employees
ENABLE CONSTRAINT emp_emp_id_pk;
5.查询约束
SELECT constraint_name, constraint_type,
search_condition
FROM user_constraints
WHERE table_name = ‘EMPLOYEES‘;
6.查询约束的列
通过数据字典视图:USER_CONS_COLUMNS,实际上,如果约束名有规范是可以直接看到的!
SELECT constraint_name, column_name FROM user_cons_columns WHERE table_name = ‘EMPLOYEES‘;