约束就是指对插入数据的各种限制,例如:人员的姓名不能为空,人的年龄只能在0~150岁之间。约束可以对数据库中的数据进行保护。约束可以在建表的时候直接声明,也可以为已建好的表添加约束。
1、NOT NULL:非空约束
CREATE TABLE person ( pid NUMBER , name VARCHAR(30) NOT NULL ) ;
2、PRIMARY KEY:主键约束
不能重复,不能为空
? 例如:身份证号不能为空。
现在假设pid字段不能为空,且不能重复。
DROP TABLE person ;
CREATE TABLE person ( pid NUMBER PRIMARY KEY , name VARCHAR(30) NOT NULL ) ;
3、UNIQUE:唯一约束,值不能重复(空值除外)
人员中有电话号码,电话号码不能重复。
DROP TABLE person ;
CREATE TABLE person ( pid NUMBER PRIMARY KEY NOT NULL , name VARCHAR(30) NOT NULL , tel VARCHAR(50) UNIQUE ) ;
4、CHECK:条件约束,插入的数据必须满足某些条件
例如:人员有年龄,年龄的取值只能是0~150岁之间
DROP TABLE person ;
CREATE TABLE person ( pid NUMBER PRIMARY KEY NOT NULL , name VARCHAR(30) NOT NULL ,
tel VARCHAR(50) NOT NULL UNIQUE , age NUMBER CHECK(age BETWEEN 0 AND 150)) ;
5、Foreign Key:外键
DROP TABLE book ;
CREATE TABLE book
(
bid NUMBER PRIMARY KEY NOT NULL ,
name VARCHAR(50) ,
– 书应该属于一个人
pid NUMBER REFERENCES person(pid) ON DELETE CASCADE
– 建立约束:book_pid_fk,与person中的pid为主-外键关系
–CONSTRAINT book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid)
) ;
INSERT INTO book(bid,name,pid) VALUES(1001,‘JAVA’,12) ;
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
) ;
以上两张表中没有任何约束,下面使用 alter命令为表添加约束
1 、 为两个表添加主键:
表pid为主键:
ALTER TABLE person ADD CONSTRAINT person_pid_pk PRIMARY KEY(pid) ;
表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 ;
7、删除约束
Alter table book drop constraint person_book_pid_fk;
alter table student drop unique(tel);
8、启用约束
ALTER TABLE book enable CONSTRAINT person_book_pid_fk ;
9、禁用约束
ALTER TABLE book disable CONSTRAINT person_book_pid_fk ;
10、练习
创建一张表 student
id number
name varchar2(10)
age number(10)
tel varchar2(10)
id 字段添加主键约束
name 字段添加非空约束
age 字段添加 check 约束(age 必须大于 18 岁)
tel 添加唯一 非空 约束
create table student(
id number primary key,
name varchar2(10) not null,
age number(10) check(age > 18),
tel varchar2(10) unique not null
);
创建一张学员兴趣爱好表 hobby
id number(10)
hobby_name varchar2(10)
sid number --学生 id
sid 字段添加外键约束,并且要带级联删除
create table hobby(
id number(10),
hobby_name varchar2(10),
sid number references student(id) on delete cascade
);
删除掉 student 表中 tel 字段的唯一约束(先写出查看该表约束的 sql)
select constraint_name, constraint_type from all_constraints where user_table = upper(‘student’); alter
table student drop constraint unique(tel);
手动添加 student 表中 tel 字段的唯一约束(约束名为:MY_CONSTRAINT_1)
alter table student add constraint MY_CONSTRAINT_1 unique(tel);
禁用约束 MY_CONSTRAINT_1
alter table student disable constraint MY_CONSTRAINT_1;
启用约束 MY_CONSTRAINT_1
alter table student enable constraint MY_CONSTRAINT_1;