极度郁闷,有一段时间没登陆51了,今天回来竟然把提示问题给弄丢了,猜了半个小时才猜出来。。。。

数据库之约束

上一篇 / 下一篇  2010-01-07 07:59:06 / 个人分类:Oracle

--建表并建立好约束(1)
create table students
(
sid number primary key,
sname varchar2(20) unique not null,
ssex char(2) check(ssex = '男' or ssex = '女'),
sage number(3) check(sage > 0 and sage < 100),
saddress varchar2(50) default('地址不详')
);

--建表并建立好约束[推荐](2)
create table students
(
sid number,
sname varchar2(20) not null,
ssex char(2),
sage number(3),
saddress varchar2(50) default('地址不详'),
constraint pk_students_sid primary key(sid),
constraint uk_students_sname unique(sname),
constraint ck_studnets_ssex check(ssex between 0 and 150),
constraint ck_students_sage check(sage in('男', '女'))
);

--先建表
create table students
(
sid number,
sname varchar2(20) not null,
ssex char(2),
sage number(3),
saddress varchar2(50) default('地址不详')
);

--再建约束
alter table students add constraint pk_students_sid primary key(sid);
alter table students add constraint uq_students_sname unique(sname);
alter table students add constraint ck_students_ssex check(ssex = '男' or ssex = '女');
alter table students add constraint ck_students_sage check(sage > 0 and sage < 100);

--删除约束
alter table students drop constraint pk_students_sid;
alter table students drop constraint uq_students_sname;
alter table students drop constraint ck_students_ssex;
alter table students drop constraint ck_students_sage;

--建立如下两张表和约束
create table department as select * from dept;
alter table department add constraint pk_department_deptno primary key(deptno);
select constraint_name from user_constraints where table_name = upper('department');

create table employee as select empno, ename, job, deptno from emp;
alter table employee add constraint pk_employee_empno primary key(empno);
alter table employee add constraint fk_employee_department_deptno foreign key(deptno) references department(deptno);
select constraint_name from user_constraints where table_name = upper('employee');

注意:被关联或被引用的主键表中的字段必须是主键

如果现在有两张存在主外键关系的表, 通常直接删除主表中的数据是不允许的,因为在主表中存在着被外键表关联或引用的字段.
所以通常是先删除外键表中的数据,再删除主键表中的数据.同时还有一种解决这种问题的办法:
在建表并建立好约束的同时,也就是在建立外键约束的时候加上 on delete cascade,这样就可以做到级联删除数据.
例如修改以上外键表(employee)的约束:
alter table employee drop constraint fk_employee_department_deptno;
alter table employee add constraint fk_employee_department_deptno foreign key(deptno) references department(deptno) on delete cascade;

这样,当我们删除主键表(department)中的数据的时候,系统会自动删除外键表(employee)中关联主键表(department)的那些数据.
例如我们现在删除了主键表(department)中部门编号为 10 的部门, 那么系统会自动删除外键表(employee)中部门编号为 10 的所有员工信息.

如果现在有两张存在主外键关系的表, 通常直接删除主表是不允许的, 因为在主表中存在着被外键表关联或引用的字段.
所以通常是先删除外键表, 再删除主键表. 同时也有一种解决这种问题的办法, 但不推荐这样做:
例如:
drop table department cascade constraint

因为外键表(employee)关联了主键表(department)中的字段, 所以通常是不允许直接删除主键表(department)的.
那么我们现在可以强制性的删除主键表(department): drop table department cascade constraint
这样就删除了主键表(department),而且还删除了主键表(department)和外键表(employee)之间的关联约束.
即主键表(department)中的约束 pk_department_deptno 和外键表(employee)中的约束 fk_employee_department_deptno
都被删除了.

TAG: 数据库 约束

 

评分:0

我来说两句

Open Toolbar