Oracle笔记(十)约束(三)

2014-11-24 16:18:22 · 作者: · 浏览: 2
CONSTRAINT pk_bid PRIMARY KEY(bid),
CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid)
);
此时,只是增加了一个约束,这样一来如果输入的数据有错误,则会出现如下的提示:
ORA-02291: 违反完整约束条件 (SCOTT.FK_MID) - 未找到父项关键字
因为member.mid没有指定的数据,所以book.mid如果数据有错误,则无法执行更新操作。
使用外键的最大好处是控制了子表中某些数据的取值范围,但是同样带来了不少的问题;
1、 删除数据的时候,如果主表中的数据有对应的子表数据,则无法删除;
范例:删除member表中mid为1的数据
DELETE FROM member WHERE mid=1;
错误提示信息:“ORA-02292: 违反完整约束条件 (SCOTT.FK_MID) - 已找到子记录”。
此时,只能先删除子表记录,之后再删除父表记录:
DELETE FROM book WHERE mid=1;
DELETE FROM member WHERE mid=1;
但是这种操作明显不方便,如果说现在希望主表数据删除之后,子表中对应的数据也可以删除的话,则可以在建立外键约束的时候指定一个级联删除的功能,修改 数据库创建脚本:
www.2cto.com
DROP TABLE member PURGE;
DROP TABLE book PURGE;
CREATE TABLE member(
mid NUMBER,
name VARCHAR2(50) NOT NULL,
CONSTRAINT pk_mid PRIMARY KEY(mid)
);
CREATE TABLE book(
bid NUMBER,
title VARCHAR2(50) NOT NULL,
mid NUMBER,
CONSTRAINT pk_bid PRIMARY KEY(bid),
CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid) ON DELETE CASCADE
);
此时由于存在级联删除的操作,所以主表中的数据删除之后,对应的子表中的数据也都会被同时删除。
2、 删除数据的时候,让子表中对应的数据设置为null
当主表中的数据删除之后,对应的子表中的数据相关项也希望将其设置为null,而不是删除,此时,可以继续修改数据表的创建脚本:
DROP TABLE member PURGE;
DROP TABLE book PURGE;
CREATE TABLE member(
mid NUMBER,
name VARCHAR2(50) NOT NULL,
CONSTRAINT pk_mid PRIMARY KEY(mid)
);
CREATE TABLE book(
bid NUMBER,
title VARCHAR2(50) NOT NULL,
mid NUMBER,
CONSTRAINT pk_bid PRIMARY KEY(bid),
CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid) ON DELETE SET NULL
); www.2cto.com
INSERT INTO member(mid,name) VALUES(1,'张三');
INSERT INTO member(mid,name) VALUES(2,'李四');
INSERT INTO book(bid,title,mid) VALUES(101,' Java开发',1);
INSERT INTO book(bid,title,mid) VALUES(102,'Java Web开发',2);
INSERT INTO book(bid,title,mid) VALUES(103,'EJB开发',2);
INSERT INTO book(bid,title,mid) VALUES(105,' Android开发',1);
INSERT INTO book(bid,title,mid) VALUES(107,'AJAX开发',1);
3、 删除父表之前必须首先先删除对应的子表,否则无法删除
DROP TABLE book PURGE;
DROP TABLE member PURGE;
但是这样做明显很麻烦,因为对于一个未知的数据库,如果要按照此类方式进行,则必须首先知道其父子关系,所以在 Oracle之中专门提供了一个强制性删除表的操作,即:不再关心约束,在删除的时候写上一句“CASCADE CONSTRAINT”。
DROP TABLE member CASCADE CONSTRAINT PURGE;
DROP TABLE book CASCADE CONSTRAINT PURGE;
此时,不关心子表是否存在,直接强制性的删除父表。
合理做法:在以后进行数据表删除的时候,最好是先删除子表,之后再删除父表。
六、修改约束
约束本身也属于数据库对象,那么也肯定可以进行修改操作,而且只要是修改都使用ALTER指令,约束的修改主要指的是以下两种操作:
为表增加约束:
ALTER TABLE 表名称 ADD CONSTRAINT 约束名称 约束类型(字段);
删除表中的约束:
ALTER TABLE 表名称 DROP CONSTRAINT 约束名称;
可以发现,如果要维护约束,肯定需要一个正确的名字才可以,可是在这五种约束之中,非空约束作为一个特殊的约束无法操作,现在有如下一张数据表:
DROP TABLE member CASCADE CONSTRAINT PURGE;
CREATE TABLE member( www.2cto.com
mid NUMBER,
name VARCHAR2(50) NOT NULL,
age NUMBER(3)
);
范例:为表中增加主键约束
ALTER TABLE member ADD CONSTRAINT pk_mid PRIMARY KEY(mid);
增加数据:
INSERT INTO member(mid,name,age) VALUES(1,'张三',30);
INSERT INTO member(mid,name,age) VALUES(2,'李四',300);
现在在member表中已经存在了年龄上的非法数据,所以下面为member表增加检查约束:
ALTER TABLE member ADD CONSTRAINT ck_age CHECK(age BETWEEN 0 AND 250);
这个时候在表中已经存在了违反约束的数据,所以肯定无法增加。
范例:删除member表中的mid上的主键约束 www.2cto.com
ALTER TABLE member DROP CONSTRAINT pk_mid;
可是,跟表结构一样,约束最好也不要修改,而且记住,