17、约束

在数据库表的开发中,约束是必不可少的支持,使用约束可以更好的保证数据库中数据的完整性。

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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值