zoukankan      html  css  js  c++  java
  • oracle Constraint[相似 constraint使用方法总结 I]

    约束简单介绍
    约束用于确保数据库数据满足特定的商业逻辑或者企业规则,假设定义了约束,而且数据不符

    合约束,那么DML操作(INSERT、UPDATE、DELETE)将不能成功运行。约束包含NOT NULL、UNIQUE、PRIMARY KEY、FOREING KEY 以及CHECK等五种类型

    定义约束
    列级约束:

    column [CONSTRAINT constraint_name] constraint_type
    表级约束:
    column ,...,
    [CONSTRAINT constraint_name] constraint_type (column,...)

    1.定义NOT NULL约束
    NOT NULL 约束仅仅能在列级定义,不能在表级定义
    例:
    CREATE TABLE emp01(
    eno INT  NOT NULL,
    name VARCHAR2(10) CONSTRAINT nn_name2 NOT NULL,
    salary NUMBER(6,2)
    );
    上例中,eno列与name列上定义了NOT NULL约束,当中eno列的NOT NULL约束没有指定约束名,而

    name列则指定了约束名nn_name。
    能够通过查询user_constraints字典来查看所定义的约束,如:
    SQL> select constraint_name,constraint_type from user_constraints
    2  where table_name='EMP01';

    CONSTRAINT_NAME                                              CO
    ------------------------------------------------------------ --
    SYS_C0010618                                                 C
    NN_NAME                                                      C
    可见,没有给约束名的,系统将会自己主动的定义一个约束名称,当中约束类型中,P:表示主键,R:

    表示外键,C表示NOT NULL或CHECK,U表示UNIQUE。且系统中同一方案下的的约束名不能反复

    2.定义UNIQUE约束
    定义了惟一约束之后,惟一约束列的列值不能反复,但能够为NULL。UNIQUE约束既能够在列级

    定义,也能够在表级定义
    例:
    CREATE TABLE emp02(
    eno INT UNIQUE,name VARCHAR2(10) CONSTRAINT u_name UNIQUE,
    salary NUMBER(6,2)
    );
    相同,假设没有给出约束名,系统会自己主动定义一个名称,可从查询结果得出
    SQL> select constraint_name,constraint_type from user_constraints
    2  where table_name='EMP02';

    CONSTRAINT_NAME                                              CO
    ------------------------------------------------------------ --
    SYS_C0010623                                                 U
    U_NAME
    U

    3.定义PRIMARY KEY 约束
    当定义主键约束后,主键约束列的列值不仅不能反复,并且也不能为NULL。主键约束既能够在

    列级定义,也能够在表级定义。一张表最多仅仅能具有一个主键约束,当一个表中的多个列都要为

    主键是,能够在表级定义。
    例1:列级定义主键
    CREATE TABLE depto04(
    dno INT PRIMARY KEY,
    dname VARCHAR2(10),loc VARCHAR2(20)
    );
    通过查询user_constraints可得出
    SQL>  select constraint_name ,constraint_type from user_constraints
    2  where table_name='DEPT04';

    CONSTRAINT_NAME                                              CO
    ------------------------------------------------------------ --
    SYS_C0010625                                                 P
    通过查询user_cons_columns可得出
    SQL> select constraint_name,column_name from user_cons_columns
    2  where table_name='DEPT04';

    CONSTRAINT_NAME                                              COLUMN_NAME
    ------------------------------------------------------------ ------------

    SYS_C0010625                                                 DNO
    例2:表级定义主键
    CREATE TABLE dept05(
    dno INT,
    dname VARCHAR2(10),loc VARCHAR2(20),
    PRIMARY KEY(dno,dname)
    );
    通过查询user_constraints能够得出
    SQL> select constraint_name,constraint_type from user_constraints
    2  where table_name='DEPT05';

    CONSTRAINT_NAME                                              CO
    ------------------------------------------------------------ --
    SYS_C0010626                                                 P
    通过查询user_cons_columns可得出
    SQL> select constraint_name,column_name from user_cons_columns
    2  where table_name='DEPT05';

    CONSTRAINT_NAME                                              COLUMN_NAME
    ------------------------------------------------------------ -------------

    SYS_C0010626                                                 DNO
    SYS_C0010626                                                 DNAME
    可见,当在表级定义时,约束名称将会同样,而在user_cons_columns查询是,每一列将相应约束

    名称同样的两条记录

    4.定义FOREING KEY约束
    当定义了外部键约束之后,要求外部键列的数据必须在主表的主键列(或惟一列)中存在,或

    者为NULL,FOREING KEY约束既能够在列级定义,也能够在表级定义。
    keyword说明:
    FOREING KEY:该选项用于指定在表级定义外部键约束。当在表级定义外部键约束时必须指定该选

    项,在列级定义外部键约束不须要指定该选项
    REFERENCES:该选项用于指定主表名及其主键列。当定义外部键约束时,该选项必须指定。
    ON DELETE CASCAED:该选项用于指定级联删除选项。假设在定义外部键约束时指定了该选项,那

    么当删除主表数据时会级联删除从表的相关数据。
    ON DELECT SET NULL:该选项用于指定转换相关的外部键值为NULL,假设在定义外部键约束时指定

    了该选项,那么当删除主表数据时会将从表外部键列的数据设置为NULL。
    例1:列级定义外键约束
    CREATE TABLE emp04(
    eno INT,name VARCHAR2(10),salary NUMBER(6,2),
    dno INT CONSTRAINT fk_dno REFERENCES dept04(dno)
    );
    SQL> select constraint_name,constraint_type from user_constraints
    2  where table_name='EMP04';

    CONSTRAINT_NAME                                              CO
    ------------------------------------------------------------ --
    FK_DNO                                                       R
    SQL> select constraint_name,column_name from user_cons_columns
    2  where table_name='EMP04';

    CONSTRAINT_NAME                                              COLUMN_NAME
    ------------------------------------------------------------ -----------

    FK_DNO                                                       DNO
    例2:表级定义外键约束
    CREATE TABLE emp05(
    eno INT,name VARCHAR2(10),salary NUMBER(6,2),
    dno INT,
    CONSTRAINT fk_dno_name FOREIGN KEY(dno,name) REFERENCES dept05(dno,dname)
    );
    SQL> select constraint_name,constraint_type from user_constraints
    2  where table_name='EMP05'
    3  ;

    CONSTRAINT_NAME                                              CO
    ------------------------------------------------------------ --
    FK_DNO_NAME                                                  R
    SQL> select constraint_name,column_name from user_cons_columns
    2  where table_name='EMP05';

    CONSTRAINT_NAME                                              COLUMN_NAME
    ------------------------------------------------------------ -----------

    FK_DNO_NAME                                                  DNO
    FK_DNO_NAME                                                  NAME

    5.定义CHECK约束
    CHECK约束既能够在列级定义,也能够在表级定义。CHECK约束同意列为NULL。
    例:
    CREATE TABLE emp06(
    eno INT,name VARCHAR2(10),salary NUMBER(6,2),
    CHECK (salary BETWEEN 1000 AND 5000)
    );
    SQL>  select constraint_name,constraint_type from user_constraints
    2   where table_name='EMP06';

    CONSTRAINT_NAME                                              CO
    ------------------------------------------------------------ --
    SYS_C0010629                                                 C
    SQL> select constraint_name,column_name from user_cons_columns
    2  where table_name='EMP06';

    CONSTRAINT_NAME                                              COLUMN_NAME
    ------------------------------------------------------------ -----------

    SYS_C0010629                                                 SALARY

    6.定义复合约束
    复合约束即在表级定义,基于多列的复合约束,如:
    CREATE TABLE dept05(
    dno INT,
    dname VARCHAR2(10),loc VARCHAR2(20),
    PRIMARY KEY(dno,dname)
    );或
    CREATE TABLE emp05(
    eno INT,name VARCHAR2(10),salary NUMBER(6,2),
    dno INT,
    CONSTRAINT fk_dno_name FOREIGN KEY(dno,name) REFERENCES dept05(dno,dname)
    );

    9.3维护约束
    9.3.1添加约束

    假设添加UNIQUE、PRIMARY KEY、FOREIGN KEY 和CKECK 必须使用ALTER TABLE语句的ADD子句;

    假设添加NOT NULL约束,那么必须使用ALTER TABLE语句的MODIFY子句,如:
    ALTER TABLE table_name ADD [CONSTRAINT constraint_name]
    constraint_type (column,...)
    ALTER TABLE table_name MODIFY column
    [CONSTRAINT constraint_name] NOT NULL;
    9.3.2改动约束名
    在同一个方案中,约束名必须惟一,而且约束名也不能与其它对象同名。当鱫IMPDP工具或者IMP

    工具导入其它对象时,如发现有同名的对象,将会出错
    语法:
    ALTER TABLE table_name RENAME CONSTRAINT old_constraint_name
    TO new_constraint_name;
    例:
    ALTER TABLE emp01 RENAME CONSTRAINT SYS_C005028
    TO ck_emp01_salary;
    9.3.3 删除约束
    当删除特定表的主键约束时,假设该表具有相关的从表,那么在删除主键约束

    时必须带有CASCAED选项
    语法:
    ALTER TABLE table_name DROP
    CONSTRAINT constraint_name |PRIMARY KEY
    例1
    ALTER TABLE emp01 DROP CONSTRAINT ck_emp01_salary;
    例2
    ALTER TABLE dept01 DROP PRIMARY KEY CASCAED
    9.3.4禁止约束
    禁止约束指使约束暂时失效。当禁止了约束之后,约束规则将不再生效。在使用SQL*LOADER或

    INSERT装载数据之前,为了加快数据装载速度,应该首先禁止约束,然后装载数据。
    语法:
    ALTER TABLE table_name
    DISABLE CONSTRAINT constaint_name [CASCAED];--CASCAED用于指定级联禁止从表的外部键

    约束
    例:
    ALTER TABLE emp05 DISABLE CONSTAINT SYS_C00502;
    9.3.5 激活约束
    语法:
    ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;
    例:
    ALTER TABLE emp05 ENABLE CONSTRAINT SYS_C005022;
    9.4 显示约束信息
    1.USER_CONSTRAINTS
    2.USER_CONS_COLUMNS

    Zz_cnblogs :http://www.cnblogs.com/ljcbest/archive/2010/09/02/1816346.html
  • 相关阅读:
    11. Container With Most Water
    9. Palindrome Number
    375. 猜数字大小 II leetcode java
    leetcode 72 编辑距离 JAVA
    73. 矩阵置零 leetcode JAVA
    快速排序 JAVA实现
    63. 不同路径 II leetcode JAVA
    重写(override)与重载(overload)
    62 不同路径 leetcode JAVA
    leetcode 56 合并区间 JAVA
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4047391.html
Copyright © 2011-2022 走看看