Oracle笔记(十)约束(二)
入数据,则错误信息如下:
ORA-00001: 违反唯一约束条件 (SCOTT.PK_MID)
从正常的开发角度而言,一张表一般都只设置一个主键,但是从SQL语法的规定而言,一张表却可以设置多个主键,而此种做法称为复合主键,例如:参考如下代码:
DROP TABLE member PURGE; www.2cto.com
CREATE TABLE member(
mid NUMBER,
name VARCHAR2(50) NOT NULL,
CONSTRAINT pk_mid PRIMARY KEY(mid,name)
);
在复合主键的使用之中,只有两个字段的内容都一样的情况下,才被称为重复数据。
范例:插入正确的数据
INSERT INTO member(mid,name) VALUES(1,'张三');
INSERT INTO member(mid,name) VALUES(1,'李四');
INSERT INTO member(mid,name) VALUES(2,'李四');
范例:插入错误的数据
INSERT INTO member(mid,name) VALUES(1,'张三');
错误信息:
ORA-00001: 违反唯一约束条件 (SCOTT.PK_MID)
但是从开发的实际角度而言,一般都不使用复合主键,所以这个知识只是作为其相关的内容做一个介绍。只要是数据表,永远都只设置一个主键。
四、检查约束(Check):CK
检查约束指的是为表中的数据增加一些过滤条件,例如:
设置年龄的时候范围是:0~200;
设置性别的时候应该是:男、女;
范例:设置检查约束
DROP TABLE member PURGE;
CREATE TABLE member(
mid NUMBER,
name VARCHAR2(50) NOT NULL,
sex VARCHAR2(10) NOT NULL,
age NUMBER(3),
CONSTRAINT pk_mid PRIMARY KEY(mid),
CONSTRAINT ck_sex CHECK(sex IN('男','女')),
CONSTRAINT ck_age CHECK(age BETWEEN 0 AND 200)
);
范例:增加正确的数据
INSERT INTO member(mid,name,sex,age) VALUES(1,'张三','男','26');
范例:增加错误的性别 —— ORA-02290: 违反检查约束条件 (SCOTT.CK_SEX)
INSERT INTO member(mid,name,sex,age) VALUES(2,'李四','非','26');
范例:增加错误的年龄 —— ORA-02290: 违反检查约束条件 (SCOTT.CK_AGE)
INSERT INTO member(mid,name,sex,age) VALUES(2,'李四','女','260');
检查的操作就是对输入的数据进行一个过滤。
五、主-外键约束 www.2cto.com
之前的四种约束都是在单张表中进行的,而主-外键约束是在两张表中进行的,这两张表是存在父子关系的,即:子表中某个字段的取值范围由父表所决定。
例如,现在要求表示出一种关系,每一个人有多本书,应该定义两张数据表:member(主)、book(子);
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)
);
此时只是根据要求建立了两张独立的数据表,那么下面插入几条数据:
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);
要想验证这个数据是否有意义,最简单的做法,就是写两个查询。
范例:统计每个人员拥有书的数量 www.2cto.com
SELECT m.mid,m.name,COUNT(b.bid)
FROM member m,book b
WHERE m.mid=b.mid
GROUP BY m.mid,m.name;
范例:查询出每个人员的编号,姓名,拥有书的名称
SELECT m.mid,m.name,b.title
FROM member m,book b
WHERE m.mid=b.mid;
即,现在的book.mid字段应该是与member.mid字段相关联的,但是由于本程序没有设置约束,所以,现在以下的数据也是可以增加的:
INSERT INTO book(bid,title,mid) VALUES(108,'PhotoShop使用手册',3);
INSERT INTO book(bid,title,mid) VALUES(109,'FLEX开发手册',8);
现在增加了两条新的记录,而且记录可以保存在数据表之中,但是这两条记录没有意义,因为member.mid字段的内容没有3和8,而要想解决这个问题就必须依靠外键约束来解决。
让book.mid的字段的取值由member.mid所决定,如果member.mid的数据真实存在,则表示可以更新。
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,