您的位置:首页 > 数据库 > Oracle

Oracle_6 约束条件

2011-02-28 10:55 711 查看
约束就是指对插入数据的各种限制,例如:人员的姓名不能为空,人的年龄只能在0~100岁之间。约束可以对数据库中的数据进行保护。约束可以在建表的时候直接声明,也可以为已建好的表添加约束。

1. NOT NULL:非空约束

例如:学生表中学号不能为空

CREATE TABLE student
(
Pid NUMBER NOT NULL,
Name VARCHAR(30)
);
//插入数据:
INSERT INTO student(pid,name) VALUES (11,'张三');
//插入错误的数据,会受到约束限制,不能插入
INSERT INTO student(name) VALUES (‘张三’);


2. PRIMARY KEY:主键约束

主键约束的限制条件是:不能重复,不能为空

例如:一个人的身份证号不能重复也不能为空

CREATE TABLE person
(
Pid NUMBER PRIMARY KEY ,
Name VARCHAR(30) NOT NULL
) ;
//插入数据
INSERT INTO person(pid,name) VALUES (11,'张三');
//主键重复了
INSERT INTO person(pid,name) VALUES (11,'李四');


3. UNIQUE:唯一约束,值不能重复(空值除外)

例如:人员中有电话号码,电话号码不能重复。

CREATE TABLE person
(
Pid NUMBER PRIMARY KEY NOT NULL ,
Name VARCHAR(30) NOT NULL ,
Tel VARCHAR(50) UNIQUE
) ;
//插入数据
INSERT INTO person(pid,name,tel) VALUES (11,'张三','1234567');
//电话重复了
INSERT INTO person(pid,name,tel) VALUES (12,'李四','1234567');


4.CHECK:条件约束,插入的数据必须满足某些条件

例如:人员有年龄,年龄的取值只能是0~100 岁之间

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)
) ;
//插入数据
INSERT INTO person(pid,name,tel,age) VALUES (11,'张三','1234567',30);
//年龄的输入错误
INSERT INTO person(pid,name,tel,age) VALUES (12,'李四','2345678',-100);


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 一致。 此时就需要外键的支持。修改book 的表结构。

CREATE TABLE book
(
Bid NUMBER PRIMARY KEY NOT NULL ,
Name VARCHAR(50) ,
-- 书应该属于一个人
pidNUMBER 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
(
bidNUMBER PRIMARY KEY NOT NULL ,
nameVARCHAR(50) ,
-- 书应该属于一个人
pidNUMBER ,
-- 建立约束:book_pid_fk,与person 中的pid 为主-外键关系
CONSTRAINT 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);


注:sql语句中的注释应该是

--这是一条注释
create table student
{........


文中只是为了便于区别使用编程语言的注释符号

本文出自《Oracle教程》感谢原作者Louis
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐