码迷,mamicode.com
首页 > 其他好文 > 详细

约束(11)

时间:2017-11-02 00:04:54      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:char   insert   bsp   ima   默认   无法   varchar2   修改   检查   

约束的分类

在实际中,约束主要分为以下五种约束:

  • · 主键约束:主键表示是一个唯一的标识,本身不能为空

  |- 例如:身份证编号是唯一的,不可重复的,不可为空的

  • · 唯一约束:在一个表中只允许建立一个主键约束,而其他列如果不希望出现重复值的话,则就可以使用唯一约束
  • · 检查约束:检查一个列的内容是否合法

  |- 例如:年龄,只能在 0~150 随

  |- 例如:性别,只能是男、女、中性

  • · 非空约束:姓名这样的字段里面的内容就不能为空
  • · 外键约束:在两张表中进行约束操作

主键约束(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 (11111111111111111,张三,30,TO_DATE(1976-02-13,yyyy-mm-dd),) ;
INSERT INTO person(pid,name,age,birthday,sex) VALUES (11111111111111111,李四,30,TO_DATE(1976-02-13,yyyy-mm-dd),) ;

技术分享

错误信息:ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C0011321)

错误信息上给出的是一个编号的形式,实际上此编号就表示约束的名称

通过 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 (11111111111111111,张三,30,TO_DATE(1976-02-13,yyyy-mm-dd),) ;
INSERT INTO person(pid,name,age,birthday,sex) VALUES (11111111111111111,李四,30,TO_DATE(1976-02-13,yyyy-mm-dd),) ;

技术分享

错误信息:ORA-00001: 违反唯一约束条件 (SCOTT.PERSON_PID_PK)

PERSON_PID_PK,就表示之前在建立数据库表的时候指定的约束名称

 非空约束(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 (11111111111111111,null,30,TO_DATE(1976-02-13,yyyy-mm-dd),) ;
INSERT INTO person(pid,name,birthday,sex) VALUES (22222222222222222,张三,TO_DATE(1976-02-13,yyyy-mm-dd),) ;

技术分享

在错误提示中,可以发现,已经明确的指明了错误所发生的字段名称

ORA-01400: 无法将 NULL 插入 ("SCOTT"."PERSON"."NAME")

ORA-01400: 无法将 NULL 插入 ("SCOTT"."PERSON"."AGE")

 唯一约束(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 (11111111111111111,张三,30,TO_DATE(1976-02-13,yyyy-mm-dd),) ;
INSERT INTO person(pid,name,age,birthday,sex) VALUES (22222222222222222,张三,30,TO_DATE(1976-02-13,yyyy-mm-dd),) ;

技术分享

第一条数据正常插入,第二条数据,名字违反了唯一约束条件,所以出现了以下的错误信息:

ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C0011329)

此错误信息,也是使用自动的约束名称编号,所以要想指定约束的名称,也可以通过 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)
) ;

检查约束(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 (11111111111111111,张三,300,TO_DATE(1976-02-13,yyyy-mm-dd),) ;

技术分享

错误信息:ORA-02290: 违反检查约束条件 (SCOTT.SYS_C0011332)

错误信息中的所有约束错误都是采用的自动命名的形式,那么在 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 (,,))
) ;

 主- 外键约束(FOREIGN KEY)

 主-外键约束是针对于两张表的约束,在使用主-外键关联的时候也要有以下的注意点;

  • 在子表中设置的外键在父表中必须是主键
  •  删除时应该先删除子表,再删除父表

 存在关联关系无法删除子表,强制性的删除,不管约束,而直接删除,但是这种做法一般不使用

DROP TABLE book CASCADE CONSTRAINT ;

父表与子表存在关联数据,想要删除父表数据必须先将子表中对应数据删除

如果,希望一个表中的数据在删除时,可以自动删除掉其对应的子表记录,则就可以使用级联删除的操作

DROP TABLE book ;
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 (,,))
) ;
CREATE TABLE book
(
  bid  NUMBER PRIMARY KEY NOT NULL ,
  bname  VARCHAR(30) ,
  bprice  NUMBER(5,2) ,
  pid  VARCHAR2(18) ,
  CONSTRAINT person_book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid) ON DELETE CASCADE
) ;

修改约束

添加约束的语法如下:

ALTER TABLE 表名称 ADD CONSTRAINT 约束名称 约束类型(约束字段) ;

关于约束类型的命名一定要统一:

  • · PRIMARY KEY:主键字段_PK
  • · UNIQUE:字段_UK
  • · CHECK:字段_CK
  • · FOREIGN KEY:父字段_子字段_FK

如果要想增加主-外键约束,则可以创建一个没有约束的 book 表

DROP TABLE book ;
CREATE TABLE book
(
  bid  NUMBER,
  bname  VARCHAR(30) ,
  bprice  NUMBER(5,2) ,
  pid  VARCHAR2(18)
) ;

为表中增加主键、外键约束

ALTER TABLE book ADD CONSTRAINT book_bid_PK PRIMARY KEY(bid) ;
ALTER TABLE book ADD CONSTRAINT person_book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid) ONDELETE CASCADE ;

可以增加约束,那么就可以删除约束,删除约束的时候要指定约束的名称

ALTER TABLE 表名称 DROP CONSTRAINT 约束名称 ;

约束(11)

标签:char   insert   bsp   ima   默认   无法   varchar2   修改   检查   

原文地址:http://www.cnblogs.com/aaron911/p/7768886.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!