在数据库表的开发中,约束是必不可少的支持,使用约束可以更好的保证数据库中数据的完整性。
5.3.1、约束的分类:
在实际中,约束主要分为以下五种约束:
·主键约束:主键表示是一个唯一的标识,本身不能为空
|- 例如:身份证编号是唯一的,不可重复的,不可为空的
·唯一约束:在一个表中只允许建立一个主键约束,而其他列如果不希望出现重复值的话,则就可以使用唯一约束。
·检查约束:检查一个列的内容是否合法
|- 例如:年龄,只能在0~150岁
|- 例如:性别,只能是男、女、中性
·非空约束:姓名这样的字段里面的内容就不能为空
·外键约束:在两张表中进行约束操作。
5.3.2、主键约束(PRIMARY KEY):
主键约束一般都是在id上使用,而且本身已经默认了内容不能为空。主键约束可以在建立表的时候指定:
范例:建立person表,在pid上增加主键约束
DROP TABLE person; CREATE TABLE person( pid VARCHAR2(18) PRIMARY KEY, name VARCHAR2(200), age NUMBER(3), birthday DATE, sex VARCHAR2(2) DEFAULT '男' ); |
范例:插入数据,其中插入的主键重复和为空
INSERT INTO person(pid,name,age,birthday,sex) VALUES ('111111111111111111','张三',33,TO_DATE('1976-02-13','yyyy-mm-dd'),'女'); |
INSERT INTO person(pid,name,age,birthday,sex) VALUES ('111111111111111111','李四',33,TO_DATE('1976-02-13','yyyy-mm-dd'),'男'); |
错误信息:
ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C005285) |
错误信息上给出的是一个编号的形式,实际上此编号就表示约束的名称。
INSERT INTO person(pid,name,age,birthday,sex) VALUES (null,'王五',33,TO_DATE('1976-02-13','yyyy-mm-dd'),'男'); |
错误信息:
ORA-01400: 无法将 NULL 插入 ("SCOTT"."PERSON"."PID") |
在错误信息上明确的指出在SCOTT用户下的PERSON表的PID字段不允许为空。
以上的约束是属于系统自动分配好的约束名称,也可以通过CONSTRAINT指定一个约束的名字。
范例:将Person中的pid指定名称
DROP TABLE person; CREATE TABLE person( pid VARCHAR2(18), name VARCHAR2(200), age NUMBER(3), birthday DATE, sex VARCHAR2(2) DEFAULT '男', CONSTRAINT person_pid_pk PRIMARY KEY(pid) ); |
表创建成功之后,再次加入重复的数据。
INSERT INTO person(pid,name,age,birthday,sex) VALUES ('111111111111111111','张三',33,TO_DATE('1976-02-13','yyyy-mm-dd'),'女'); INSERT INTO person(pid,name,age,birthday,sex) VALUES ('111111111111111111','李四',33,TO_DATE('1976-02-13','yyyy-mm-dd'),'男'); |
错误信息:
ORA-00001: 违反唯一约束条件 (SCOTT.PERSON_PID_PK) |
PERSON_PID_PK,就表示之前在建立数据库表的时候指定的约束名称。
5.3.3、非空约束(NOT NULL)
使用非空约束,表示一个字段的内容不允许为空,即:插入数据的时候必须插入内容
DROP TABLE person; CREATE TABLE person( pid VARCHAR2(18), name VARCHAR2(200) NOT NULL, age NUMBER(3) NOT NULL, birthday DATE, sex VARCHAR2(2) DEFAULT '男', CONSTRAINT person_pid_pk PRIMARY KEY(pid) ); |
范例:插入空的数据
INSERT INTO person(pid,name,age,birthday,sex) VALUES ('111111111111111111',null,33,TO_DATE('1976-02-13','yyyy-mm-dd'),'女'); INSERT INTO person(pid,name,birthday,sex) VALUES ('222222222222222222','张三',TO_DATE('1976-02-13','yyyy-mm-dd'),'女'); |
在错误提示中,可以发现,已经明确的指明了错误所发生的字段名称。
ORA-01400: 无法将 NULL 插入 ("SCOTT"."PERSON"."NAME") ORA-01400: 无法将 NULL 插入 ("SCOTT"."PERSON"."AGE") |
5.3.4、唯一约束(UNIQUE)
表示一个字段中的内容是唯一的,其他列不允许重复。
假设:现在姓名不允许出现重名的情况。
DROP TABLE person; CREATE TABLE person( pid VARCHAR2(18), name VARCHAR2(200) UNIQUE NOT NULL, age NUMBER(3) NOT NULL, birthday DATE, sex VARCHAR2(2) DEFAULT '男', CONSTRAINT person_pid_pk PRIMARY KEY(pid) ); |
范例:向表中插入数据,数据插入两条
INSERT INTO person(pid,name,age,birthday,sex) VALUES ('111111111111111111','张三',33,TO_DATE('1976-02-13','yyyy-mm-dd'),'女'); INSERT INTO person(pid,name,age,birthday,sex) VALUES ('222222222222222222','张三',33,TO_DATE('1976-02-13','yyyy-mm-dd'),'女'); |
第一条数据正常插入,第二条数据,名字违反了唯一约束条件,所以出现了以下的错误信息:
ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C005297) |
此错误信息,也是使用自动的约束名称编号,所以要想指定约束的名称,也可以通过CONSTRAINT关键字进行命名
DROP TABLE person; CREATE TABLE person( pid VARCHAR2(18), name VARCHAR2(200) NOT NULL, age NUMBER(3) NOT NULL, birthday DATE, sex VARCHAR2(2) DEFAULT '男', CONSTRAINT person_pid_pk PRIMARY KEY(pid), CONSTRAINT person_name_uk UNIQUE(name) ); |
再次执行数据的插入操作:
INSERT INTO person(pid,name,age,birthday,sex) VALUES ('111111111111111111','张三',33,TO_DATE('1976-02-13','yyyy-mm-dd'),'女'); INSERT INTO person(pid,name,age,birthday,sex) VALUES ('222222222222222222','张三',33,TO_DATE('1976-02-13','yyyy-mm-dd'),'女'); |
错误信息:
ORA-00001: 违反唯一约束条件 (SCOTT.PERSON_NAME_UK) |
在错误信息上已经明确的显示出了自己定义的约束名称。
5.3.5、检查约束(CHECK)
使用检查约束来判断一个列中插入的内容是否合法,例如:年龄的取值范围、性别的取值范围。
DROP TABLE person; CREATE TABLE person( pid VARCHAR2(18), name VARCHAR2(200) NOT NULL, age NUMBER(3) NOT NULL CHECK(age BETWEEN 0 AND 150), birthday DATE, sex VARCHAR2(2) DEFAULT '男' CHECK(sex IN ('男','女','中')), CONSTRAINT person_pid_pk PRIMARY KEY(pid), CONSTRAINT person_name_uk UNIQUE(name) ); |
范例:插入错误的年龄
INSERT INTO person(pid,name,age,birthday,sex) VALUES ('111111111111111111','张三',330,TO_DATE('1976-02-13','yyyy-mm-dd'),'女'); |
错误信息:
ORA-02290: 违反检查约束条件 (SCOTT.SYS_C005304) |
范例:插入错误的性别
INSERT INTO person(pid,name,age,birthday,sex) VALUES ('111111111111111111','张三',33,TO_DATE('1976-02-13','yyyy-mm-dd'),'无'); |
错误信息:
ORA-02290: 违反检查约束条件 (SCOTT.SYS_C005311) |
以上的两条错误信息中的所有约束错误都是采用的自动命名的形式,那么在CHECK中也可以使用手工命名的形式:
DROP TABLE person; CREATE TABLE person( pid VARCHAR2(18), name VARCHAR2(200) NOT NULL, age NUMBER(3) NOT NULL, birthday DATE, sex VARCHAR2(2) DEFAULT '男', CONSTRAINT person_pid_pk PRIMARY KEY(pid), CONSTRAINT person_name_uk UNIQUE(name) , CONSTRAINT person_age_ck CHECK(age BETWEEN 0 AND 150), CONSTRAINT person_sex_ck CHECK(sex IN ('男','女','中')) ); |
再次插入错误的年龄:
INSERT INTO person(pid,name,age,birthday,sex) VALUES ('111111111111111111','张三',330,TO_DATE('1976-02-13','yyyy-mm-dd'),'女'); |
错误信息:
ORA-02290: 违反检查约束条件 (SCOTT.PERSON_AGE_CK) |
错误的性别:
INSERT INTO person(pid,name,age,birthday,sex) VALUES ('111111111111111111','张三',33,TO_DATE('1976-02-13','yyyy-mm-dd'),'无'); |
错误信息:
ORA-02290: 违反检查约束条件 (SCOTT.PERSON_SEX_CK) |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21817401/viewspace-620264/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/21817401/viewspace-620264/