• 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 语句指定约束的名字

     





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

  • 相关阅读:
    基于Dubbo框架构建分布式服务(一)
    大型网站架构系列:消息队列
    Redis Cluster 分区实现原理
    Redis五种数据结构简介
    Java中创建对象的5种方式
    Netty 系列之 Netty 高性能之道
    Java 抽象类与接口
    谈iOS抓包:Mac下好用的HTTP/HTTPS抓包工具Charles
    Web系统大规模并发——电商秒杀与抢购
    [转]MS SQL Server 数据库连接字符串详解
  • 原文地址:https://www.cnblogs.com/aaron911/p/7768886.html
Copyright © 2020-2023  润新知