1.定义:
约束是强加在表上的规则或条件。
2.约束的功能:
实现一些业务规则,防止无效的垃圾数据进入数据库。
维护数据库的完整性(完整性指正确性与一致性),从而使数据库的开发和维护都更加容易。
3.约束的分类:
①not mull 非空约束
②unique 唯一约束
③primary key 主键
④foreign key 外键
⑤check 定义一般性约束
4.语法
增加:alter table 表名 add constraint 约束名 约束关键字(列名);
删除:alter table 表名 drop constraint 约束名;
约束失效:alter table 表名 disable constraint 约束名 cascade;
使用cascade选项可以同时使有依赖关系的选项失效。
约束生效:alter table 表名 enable constraint 约束名;
一个唯一索引,或者主键索引在激活唯一键或主键时自动产生。
5.注意:
定义约束时没有给出约束的名字,ORACLE系统将为该约束自动生成一个名字,其格式为SYS_Cn,其中n为自然数。(强烈建议加名字)
一。主键:
1.查询表的主键:(表名要大写,否则为空)
select cu.* from user_cons_columns cu, user_constraints au
where cu.constraint_name = au.constraint_name and au.constraint_type = 'P'
and au.table_name = 'EMP';
2.删除主键:
alter table emp drop constraint emp_no_pk;
3.加主键
alter table emp add constraint emp_no_pk primary key(empno);
二。外键:
1.查询外键:(表名必须大写,否则为空)
select constraint_name "外键名", table_name "表名",R_constraint_name "参考约束名"
from user_constraints c
where c.constraint_type= 'R' and c.table_name='EMP2';
2.删除外键:
alter table emp2 drop constraint emp_dept_fk;
3.增加外键:
(父表的列必须是主键,否则会报异常ORA-02270: no matching unique or primary key for this column-list)
①alter table emp2 add constraints emp_dept_fk foreign key(DEPTNO) references dept2(DEPTNO);
②alter table emp2 add constraints emp_dept_fk foreign key(DEPTNO) references dept2(DEPTNO) on delete cascade;
注意:列名一定大写,否则操作的结果和你想的根本不一样。
补充on delete cascade:
①对于alter table emp2 add constraints emp_dept_fk foreign key(DEPTNO) references dept2(DEPTNO)语句,
如果删除父表(部门表dept)数据,根本删除不了(会报错,因为有子表的外键牵连)。
delete from dept where depto=40; 会报错。
②对于alter table emp2 add constraints emp_dept_fk foreign key(DEPTNO) references dept2(DEPTNO) on delete cascade语句,
如果删除父表(dept表)数据,不但会删除dept表的数据,还会删除子表关联的数据。
delete from dept where deptno=40; 会删除dept表中的部门为40的记录,也会删除emp表中与部门号为40相关的记录。
三。检查约束:
1.查询表有哪些约束:
select constraint_name "约束名", table_name "表名",search_condition "约束条件"
from user_constraints c
where c.constraint_type= 'C' and c.table_name='EMP2';
2.删除检查约束:
alter table emp2 drop constraint CK_EMP2_EMPNO;
3.增加检查约束:
①建表时加check约束:
create table tb_supplier
(
supplier_id number,
supplier_name varchar2(50),
contact_name varchar2(60),
/*定义CHECK约束,该约束在字段supplier_id被插入或者更新时验证,当条件不满足时触发。*/
CONSTRAINT check_tb_supplier_id CHECK (supplier_id BETWEEN 100 and 9999)
);
②已经有数据的情况下给表加check约束:
alter table emp2 add constraint ck_emp2_empno CHECK (EMPNO between 100 and 8000);
注意:必须保证表中数据符合即将添加的check条件,否则创建check约束失败。