• Oracle系列十二 约束


    约束是表级的强制规定
    有以下五种约束:

    • NOT NULL
    • UNIQUE
    • PRIMARY KEY
    • FOREIGN KEY
    • CHECK

    注意事项

    • 如果不指定约束名 ,Oracle server 自动按照 SYS_Cn 的格式指定约束名
    • 创建和修改约束:
    1. 建表的同时
    2. 建表之后
    • 可以在表级或列级定义约束
    • 可以通过数据字典视图查看约束

    表级约束和列级约束
    作用范围:
        ①列级约束只能作用在一个列上
        ②表级约束可以作用在多个列上(当然表级约束也可以作用在一个列上)
    定义方式:列约束必须跟在列的定义后面,表约束不与列一起,而是单独定义。
    非空(not null) 约束只能定义在列上
    定义约束

    CREATE TABLE [schema.]table
            (column datatype [DEFAULT expr]
            [column_constraint],
            ...
            [table_constraint][,...]);
    CREATE TABLE employees(
               employee_id  NUMBER(6),
                 first_name   VARCHAR2(20),
               ...
               job_id       VARCHAR2(10) NOT NULL,
             CONSTRAINT emp_emp_id_pk
                           PRIMARY KEY (EMPLOYEE_ID));

    定义约束

    • 列级
    column [CONSTRAINT constraint_name] constraint_type,
    • 表级
    column,...
      [CONSTRAINT constraint_name] constraint_type
      (column, ...),

    NOT NULL 约束

    • 保证列值不能为空:
    • 只能定义在列级:


    UNIQUE 约束

    • 唯一约束,允许出现多个空值:NULL。
    • 可以定义在表级或列级:


    PRIMARY KEY 约束

    可以定义在表级或列级:

    CREATE TABLE   departments(
        department_id        NUMBER(4),
        department_name      VARCHAR2(30)
          CONSTRAINT dept_name_nn NOT NULL,
        manager_id           NUMBER(6),
        location_id          NUMBER(4),
          CONSTRAINT dept_id_pk PRIMARY KEY(department_id));

    FOREIGN KEY 约束


    可以定义在表级或列级:

    CREATE TABLE employees(
        employee_id      NUMBER(6),
        last_name        VARCHAR2(25) NOT NULL,
        email            VARCHAR2(25),
        salary           NUMBER(8,2),
        commission_pct   NUMBER(2,2),
        hire_date        DATE NOT NULL,
      ...
        department_id    NUMBER(4),
        CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)
          REFERENCES departments(department_id),
        CONSTRAINT emp_email_uk UNIQUE(email));

    FOREIGN KEY 约束的关键字

    • FOREIGN KEY: 在表级指定子表中的列
    • REFERENCES: 标示在父表中的列
    • ON DELETE CASCADE(级联删除): 当父表中的列被删除时,子表中相对应的列也被删除
    • ON DELETE SET NULL(级联置空): 子表中相应的列置空

    CHECK 约束

    • 定义每一行必须满足的条件


    添加约束

    使用 ALTER TABLE 语句:

    • 添加或删除约束,但是不能修改约束
    • 有效化或无效化约束
    • 添加 NOT NULL 约束要使用 MODIFY 语句
    ALTER TABLE     table
      ADD [CONSTRAINT constraint] type (column);
    以create table emp as select * from employees;为例,添加和删除约束
    Alter table emp modify(empname varchar2(50) not null);
    


    示例

    ALTER TABLE employees
        ADD CONSTRAINT emp_manager_fk FOREIGN KEY ( manager_id )
            REFERENCES employees ( employee_id );

    删除约束

    • 从表 EMPLOYEES 中删除约束
    ALTER TABLE employees DROP CONSTRAINT emp_manager_fk;

    无效化约束

    • 在ALTER TABLE 语句中使用 DISABLE 子句将约束无效化。
    ALTER TABLE employees DISABLE CONSTRAINT emp_emp_id_pk;

    激活约束

    • ENABLE 子句可将当前无效的约束激活
    • 当定义或激活UNIQUE 或 PRIMARY KEY 约束时系统会自动创建UNIQUE 或 PRIMARY KEY索引
    ALTER TABLE        employees
    ENABLE CONSTRAINT    emp_emp_id_pk;

    查询约束

    • 查询数据字典视图 USER_CONSTRAINTS
    SELECT
        constraint_name,
        constraint_type,
        search_condition
    FROM
        user_constraints
    WHERE
        table_name = 'EMPLOYEES';

    • 查询数据字典视图 USER_CONS_COLUMNS
    SELECT
        constraint_name,
        column_name
    FROM
        user_cons_columns
    WHERE
        table_name = 'EMPLOYEES';

  • 相关阅读:
    python命令行传参详解,optparse模块OptionParse类的学习
    设计模式之共享模式
    用flask搭建一个测试数据生成器(v1.1)
    用flask搭建一个测试数据生成器(v1.0)
    jmeter中使用beanshell断言
    jmeter中beanshell脚本的使用
    从上帝视角看OS进程调度
    Linux网络内部原理系列
    从文件read/write一个字节的过程和所发生的磁盘IO
    深入理解系统中断(INTERUPT)
  • 原文地址:https://www.cnblogs.com/loaderman/p/11738934.html
Copyright © 2020-2023  润新知