--2010-09-16 21:21:11
四、约束
约束就是指对插入数据的各种限制,例如:人员的姓名不能为空,人的年龄只能在0~150岁之间。
约束可以对数据库中的数据进行保护。 约束可以在建表的时候直接声明,也可以为已建好的表添加约束。
4.1 非空约束
例如:姓名不能为空。
4.2 primary key主键约束
不能重复;
不能为空。
4.3 unique唯一约束
不能为空(空值除外)。
4.4 check条件约束
插入的数据必须满足某些条件
age NUMBER CHECK(age BETWEEN 0 AND 150);
4.5 foreign key外键约束
例如:有以下一种情况:
· 一个人有很多本书:
· Person表
· Book表:而且book中的每一条记录表示一本书的信息,一本书的信息属于一个人 CREATE TABLE book ( bid NUMBER PRIMARY KEY NOT NULL , name VARCHAR(50) , -- 书应该属于一个人 pid NUMBER ) ;
如果使用了以上的表直接创建,则插入下面的记录有效:
INSERT INTO book(bid,name,pid) VALUES(1001,'JAVA',12) ;
以上的代码没有任何错误,但是没有任何意义,因为一本书应该属于一个人,所以在此处的pid的取值应该与person表中的pid一致。此时就需要外键的支持。
4.6 级联删除
那么再分析:
如果假设一个人的人员信息没有了,那么此人所拥有的书还应该存在吗?最好,如果person中的一条数据没了,则对应在book中的数据也应该同时消失。
在之前的结构上执行delete语句,删除person表中的一条记录:
DELETE FROM person WHERE pid=11;
提示不能删除的错误:因为book中存在了此项的关联,如果person表中的一条数据删除了,则肯定会直接影响到book表中数据的完整性,所以不让删除。
如果非要删除,则应该先删除book表中的对应数据,之后再删除person表中的对应数据。
此时如果想完成删除person表的数据同时自动删除掉book表的数据操作,则必须使用级联删除。
在建立外键的时候必须指定级联删除(ON DELETE CASCADE)。
CREATE TABLE book ( bid NUMBER PRIMARY KEY NOT NULL , name VARCHAR(50) , -- 书应该属于一个人 pid NUMBER , -- 建立约束:book_pid_fk,与person中的pid为主-外键关系 CONSTRAINT book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid) ON DELETE CASCADE ) ;
DROP TABLE book ; DROP TABLE person ; CREATE TABLE person ( pid NUMBER , name VARCHAR(30) NOT NULL , tel VARCHAR(50) , age NUMBER ) ; CREATE TABLE book ( bid NUMBER , name VARCHAR(50) , pid NUMBER ) ;
4.7 添加约束
1、为两个表添加主键:
· person表pid为主键:
ALTER TABLE person ADD CONSTRAINT person_pid_pk PRIMARY KEY(pid) ;
· book表bid为主键:
ALTER TABLE book ADD CONSTRAINT book_bid_pk PRIMARY KEY(bid) ;
2、为person表中的tel添加唯一约束:
ALTER TABLE person ADD CONSTRAINT person_tel_uk UNIQUE(tel) ;
3、为person表中的age添加检查约束:
ALTER TABLE person ADD CONSTRAINT person_age_ck CHECK(age BETWEEN 0 AND 150) ;
4、为book表中的pid添加与person的主-外键约束,要求带级联删除
ALTER TABLE book ADD CONSTRAINT person_book_pid_fk FOREIGN KEY (pid) REFERENCES person(pid) ON DELETE CASCADE ;
4.8 删除约束
ALTER TABLE book DROP CONSTRAINT person_book_pid_fk ; alter table student drop unique(tel);
4.9 启用约束
ALTER TABLE book enable CONSTRAINT person_book_pid_fk ;
4.10 禁用约束
ALTER TABLE book disable CONSTRAINT person_book_pid_fk ;