约束的类型:
oracle数据库支持的约束类型包括:
1.unique 2.not null 3.primary key 4.foreignkey 5.check
约束都有名称。如果没有显示地给它们命名,oracle会生成名称。
1.唯一约束:要求表中的每一行的列(或者列的组合)的值必须不同。
索引会加强唯一约束。在定义唯一约束时,oracle会查找键列的索引,如果索引不存在,就会创建一个。
2.非空约束:要求输入键列的值。如果插入非空约束的列没有值,则会报错。
3.主键约束:定位表中单行的方法。
可以创建没有主键的表。但是不建议这么做。因为后续维护工作通常需要主键。
主键约束其实是:唯一约束和非空约束的联合。
键列必须有唯一值,它们不能为空。对于唯一约束而言,在约束的列上必须存在索引。如果不存在,那么在定义约束时会创建一个索引。
一个表只能有一个主键。但是一个表可以有许多唯一约束和非空列。
4.外键约束。在父-子关系的子表上定义外键约束。该约束要求子表中的列(或者列组合)对应父表中的主键列。这些列的名称不一定相同,但它们的数据类型必须相同。
通常唯一约束中的所有列和外键约束中的所有列最好使用非空约束定义。
如果在子表插入行,而在父表中没有匹配的行,会出错。如果删除父表中的行,而子表中有行在引用它,也会出错。
两中方法解决上面的问题:1.创建ON DELETECASCADE约束--->如果删除父表中的行,oracle会搜索子表。查找所有匹配行,并删除它们。这是自动进行。2.创建ON DELETE SET NULL约束---->如果删除父表中的行,oracle会搜索子表。查找所有匹配行,并将外键列设置为NULL。这意味着,子行依然存在。如果子表中的列也有非空约束。那么从父表中删除就会失败。
子表中的外键约束必须引用父表中唯一约束或者主键约束的列。
5.检查约束:强化简单规则。列中输入的值必须在某个范围之内。
create table dept1(
deptno number(2,0) constraint dept_deptno_pk primary key
--deptno是数字类型,2位数,没有小数。是表的主键。约束被命名为dept_deptno_pk
constraint dept_deptno_ck check (deptno between 10 and 90),
--检查约束,将它限制为从10到90数字。约束命名为dept_deptno_ck
dname varchar2(20) constraint dept_dname_nn not null);
--dname为可变长度,约束dept_dname_nn 让它不能为空值
create table emp1(
empno number(4,0) constraint emp_empno_pk primary key,
--empno数字类型,最大4位,没有小数,约束 emp_empno_pk标记为表的主键
ename varchar2(20) constraint emp_ename_nn not null,
--ename为可变长度字符,约束emp_ename_nn 不能为空值
mgr number(4,0) constraint emp_mgr_fk references emp (empno),
--mgr是员工经理,他自己也必须是员工,约束emp_mgr_fk 将empno定义为自引用外键
dob date,
hiredate date,
deptno number(2,0) constraint emp_deptno_fk references dept(deptno)
on delete set null,
--进一步将emp_depto_fk约束定义为 on delete set null ,因此如果删除dept中的父行,那么empno中所有匹配的子行都会将deptno 设置为null
email varchar2(30) constraint emp_email_uk unique,
--email 如果输入,就必须唯一也可以保留为空
constraint emp_hiredate_ck check (hiredate >= dob + 365*16),
--约束检查对童工的使用(dob 员工的生日,日期不在生日之后16年)
constraint emp_email_ck
check ((instr(email,'@')>0) and (instr(email,'.')>0))
--instr函数搜索符号@,和点(.)字符
);
--添加一个主键约束
alter table emp add constraint emp_pk primary key (empno);
--emp为父表,dept 为子表,添加一个链接表的外键约束
alter table emp add constraint dept_fk foreign key (deptno) references dept on delete set null;