Oracle 约束

约束的分类

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

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

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

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

  |- 例如:年龄,只能在 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 约束名称 ;

约束:使用约束可以保证数据库表中的数据完整性

在 SQL 中约束一共分为以下五种:

  • · 单表上的约束:

|- PRIMARY KEY,一个实体表一般都要去建立一个主键,表示唯一的编号

|- NOT NULL:一个列的内容不允许插入空值

|- UNIQU:表示此列的内容不允许重复

|- CHECK:表示此列的内容设置的时候要有限制

  • · 关联表上的约束:

|- FOREIGN KEY,表示子表的取值与父表中的取值有所关联

|- 删除的时候应该先删除子表再删除父表

|- 如果现在要想直接删除父表,可以采用 Oracle 的强制手段

|- DROP TABLE 表名称 CASCADE CONSTRAINT

|- 级联删除:ON DELETE CASCADE,当父表中的内容被删除掉之后,子表的对应内容也被删除掉。

  • · 约束本身也是可以修改的,但是不建议修改约束

|- 增加约束:ALTER TABLE ADD CONSTRAINT 约束名称 约束类型(约束字段)

|- 删除约束:ALTER TABLE DROP CONSTRAINT 约束名称

|- 如果在建立约束的时候没有给定约束的名称,系统会为其自动分配一个约束的名称,但是此名称在删除的时候就比较麻烦,所以建立表的时候可以采用 CONSTRAINT 语句指定约束的名字

 





没有高深的知识,没有进阶的技巧,万丈高楼平地起~!

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