约束是加在表上的一种强制性规则,是保证数据完整性的一种重要手段。约束可以在创建表时指定,也可以在表创建之后再指定。
约束名如果创建时没有指定,会自动生成,但如需修改约束时会比较麻烦,需要先去查出其约束名。
——oracle的五种约束
NOT NULL 非空约束
UNIQUE 唯一性约束
PRIMARY KEY 主键约束
FOREIGN KEY 外键约束
CHECK 检查约束
(DEFAULT在oracle中好像不作为约束处理)
——1.建表时创建约束(不带约束名)
create table emp(
empno number(4) primary key,
ename varchar2(10) not null,
age number(3) default 18,--在oracle中default好像不作为约束处理,在user_constraints表中查不到其信息
birthday date,
gender char(2) check (gender in ('男','女')),
email varchar2(50) unique,
deptno number(10) references dept(deptno)
)
empno number(4) primary key,
ename varchar2(10) not null,
age number(3) default 18,--在oracle中default好像不作为约束处理,在user_constraints表中查不到其信息
birthday date,
gender char(2) check (gender in ('男','女')),
email varchar2(50) unique,
deptno number(10) references dept(deptno)
)
——2.建表时创建约束(带约束名)
create table dept(
deptno number(10) ,
deptno number(10) ,
dame varchar(20),
address varchar2(30) constraint adress_nn not null, --五种约束中,not null只能在列级建立约束
job varchar(20) constraint dname_uqe unique,
dname number(10) constraint dname_ref references emp(empno),--建立主外键关系的字段属性要一致
constraint dept_pk primary key(deptno,dname)--约束涉及多个字段的组合,要在表级建立约束
address varchar2(30) constraint adress_nn not null, --五种约束中,not null只能在列级建立约束
job varchar(20) constraint dname_uqe unique,
dname number(10) constraint dname_ref references emp(empno),--建立主外键关系的字段属性要一致
constraint dept_pk primary key(deptno,dname)--约束涉及多个字段的组合,要在表级建立约束
)
——3.建表后修改约束
新增约束:alter table student add (constraint pk_sno priimary key (sno)),
修改约束:alter table demp modify (sname constraint nn_sname not null)
删除约束:alter table demp drop constraint nn_sname
删除主键和相关的外键约束:alter table dept drop primary key cascade
使约束无效:alter table demp disable constraint nn_sname
重新使约束生效:alter table enable constraint mm_sname
——查看当前用户所拥有的约束信息:
与约束有关的数据字典有两个:一个是user_constraints ;另一个是user_cons_columns
user_constraints:记录了包括约束名、约束类型、约束所在表、约束状态等信息。两个表关联可以查看主外键关系及详细数据,例如:
select
a.owner, --主键拥有者
a.table_name, --主键表
b.column_name, --主键列
c.OWNER, --外键拥有者
c.table_name, --外键表
d.column_name --外键列
from user_constraints a
left join
user_cons_columns b
on a.constraint_name=b.constraint_name
left join
user_constraints c
on c.R_CONSTRAINT_NAME=a.constraint_name
left join
user_cons_columns d
on c.constraint_name=d.constraint_name
where a.constraint_type='P'
and a.table_name='EMP' --需要查看主外键关系的表
order by a.table_name
a.owner, --主键拥有者
a.table_name, --主键表
b.column_name, --主键列
c.OWNER, --外键拥有者
c.table_name, --外键表
d.column_name --外键列
from user_constraints a
left join
user_cons_columns b
on a.constraint_name=b.constraint_name
left join
user_constraints c
on c.R_CONSTRAINT_NAME=a.constraint_name
left join
user_cons_columns d
on c.constraint_name=d.constraint_name
where a.constraint_type='P'
and a.table_name='EMP' --需要查看主外键关系的表
order by a.table_name