在数据库表的开发中,约束是必不可少的支持,使用约束可以更好的保证数据库中数据的完整性。
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)
|