zoukankan      html  css  js  c++  java
  • 约束定义及相关用法

    约束

    约束是表级的强制规定

    约束放置在表中删除有关联关系的数据

    有以下五种约束:

    NOT NULL 非空

    UNIQUE 唯一

    PRIMARY KEY 主键(非空且唯一)

    FOREIGN KEY 外键(依赖于主键)

    CHECK 检查

    CREATE TABLE EMPLOYEES(

        EMPLOYEE_ID NUMBER(6),

        LAST_NAME VARCHAR2(25) NOT NULL,

        SALARY NUMBER(8,2),

        COMMISSION_PCT NUMBER(2,2),

        HIRE_DATE DATE

                    CONSTRAINT EMP_HIRE_DATE_NN

                    NOT NULL);

    CREATE TABLE T6

    (

    X NUMBER UNIQUE,--列级约束

    Y NUMBER,

    Z NUMBER,

    CONSTRAINT CON_Y UNIQUE(Y));--表级约束

    创建一个表T7

    列名分别是a,b,c,d,e,f

    类型分别是number,varchar(2),date,number,number,number

    其中a 非空(列级约束),b列唯一(表级约束),c列默认值是当前系统时间

    向表中插入2行记录,

    1,’hehe’,default,2,3,4

    2,’haha’,default,5,6,7

    修改表,将第一行的4改成8

    CREATE TABLE T7

    (

    a NUMBER NOT NULL,

    b VARCHAR2(10),

    c DATE DEFAULT SYSDATE,

    d NUMBER,

    e NUMBER,

    f NUMBER,

    CONSTRAINT b_col UNIQUE(b));

    INSERT INTO T7 VALUES(1,'hehe',DEFAULT,2,3,4);

    INSERT INTO T7 VALUES(2,'haha',DEFAULT,5,6,7);

    UPDATE T7 SET f=8

    WHERE f=4;

    列级主键约束

    CREATE TABLE T8 (

    X NUMBER PRIMARY KEY,

    Y NUMBER,

    Z NUMBER);

    表级主键约束

    CREATE TABLE T9(

    X NUMBER,

    Y NUMBER,

    Z NUMBER,

    CONSTRAINT x_col PRIMARY KEY(X));

    联合主键约束

    CREATE TABLE T15

    (

    ID NUMBER(18),

    PHONE_NUMBER NUMBER(11),

    CONSTRAINT PK_001 PRIMARY KEY(ID,PHONE_NUMBER)

    );

    INSERT INTO T15 VALUES(110121,13500001111);

    INSERT INTO T15 VALUES(110121,13500001110);

    CREATE TABLE DEPT_I AS SELECT * FROM DEPT WHERE 1=2;要DEPT表的结构,不要它的数据

    FOREIGN KEY 外键和主键的约束关系

    wps3955.tmp

    CONSTRAINT 约束名称 FOREIGN KEY(外键所在的本表/子表的列)REFERENCES 父表(主键列)

    FOREIGN KEY约束的关键字

    ON DELETE CASCADE:当父表中的列被删除时,子表中相对应的列也被删除

    ON DELETE SET NULL:当父表中的列被删除时,子表中相对应的列置空

    CREATE TABLE DEPT_I AS SELECT * FROM DEPT;

    CREATE TABLE EMP_I AS SELECT * FROM EMP;

    ALTER TABLE DEPT_I ADD CONSTRAINT PK1 PRIMARY KEY(DEPTNO);

    ALTER TABLE EMP_I ADD CONSTRAINT FK1 FOREIGN KEY(DEPTNO) REFERENCES DEPT_I(DEPTNO);

    DELETE DEPT_I WHERE DEPTNO=10;这样删,显示违反约束条件

    设置为允许级联删除

    CREATE TABLE DEPT_II AS SELECT * FROM DEPT;

    CREATE TABLE EMP_II AS SELECT * FROM EMP;

    ALTER TABLE DEPT_II ADD CONSTRAINT PK2 PRIMARY KEY (DEPTNO);

    ALTER TABLE EMP_II ADD CONSTRAINT FK2 FOREIGN KEY (DEPTNO) REFERENCES DEPT_II(DEPTNO) ON DELETE CASCADE;

    DELETE DEPT_II WHERE DEPTNO=10;

    wps3956.tmpwps3967.tmp

    将父表被删除的值在子表列值置空

    CREATE TABLE DEPT_III AS SELECT * FROM DEPT;

    CREATE TABLE EMP_III AS SELECT * FROM EMP;

    ALTER TABLE DEPT_III ADD CONSTRAINT PK2 PRIMARY KEY (DEPTNO);

    ALTER TABLE EMP_III ADD CONSTRAINT FK2 FOREIGN KEY (DEPTNO) REFERENCES DEPT_III(DEPTNO) ON DELETE SET NULL;

    DELETE DEPT_III WHERE DEPTNO=10;

    wps3968.tmp

    wps3969.tmp

    CHECK约束 定义每一行必须满足的条件

    CREATE TABLE T12

    (

    X NUMBER,

    Y NUMBER CONSTRAINT C_O1 CHECK(Y>100)

    );

    INSERT INTO T12 VALUES(1,1);

    会报错

    wps396A.tmp

    wps396B.tmp

    所有的DDL,都不需要对表进行提交

    查看约束

    SELECT CONSTRAINT_NAME,COLUMN_NAME

    FROM USER_CONS_COLUMNS

    WHERE TABLE_NAME='EMP_I'

    禁用约束

    ALTER TABLE EMP_I

    DISABLE CONSTRAINT FK1 CASCADE;

    启用约束

    ALTER TABLE EMP_I

    ENABLE CONSTRAINT FK1;

    如果主键和外键在同一个表里,那子表里面的列的值必须要在父表里面存在才行

    删除主键约束级联删除外键约束

    ALTER TABLE T30 DROP CONSTRAINT PK1 CASCADE;

    修改列的属性

    ALTER TABLE T30 MODIFY(K DATE DEFAULT SYSDATE);

    ALTER TABLE EMP2

    DROP COLUMN EMPLOYEE_ID;--删除列

    ALTER TABLE EMP2

    DROP COLUMN EMPLOYEE_ID CASCADE CONSTRAINT;--同时删除约束

    ALTER TABLE EMP2

    DROP (EMPLOYEE_ID) CASCADE CONSTRAINT

    ALTER TABLE EMP2

    DROP (EMPLOYEE_ID,DEPARTMENT_ID,JOB_ID) CASCADE CONSTRAINT

    重命名列

    ALTER TABLE T22 RENAME COLUMN Z TO ID;

    重命名约束

    ALTER TABLE T22 RENAME CONSTRAINT SYS_C0011412 TO PK2222;

    CREATE TABLE T22 (X NUMBER PRIMARY KEY,Y NUMBER,Z NUMBER,CHECK(Y>50),CHECK(Z>50));

    SELECT CONSTRAINT_NAME,COLUMN_NAME

    FROM USER_CONS_COLUMNS

    WHERE TABLE_NAME='T22';

    ALTER TABLE T22 DROP (X,Y) CASCADE CONSTRAINT;

    ALTER TABLE T22 RENAME COLUMN Z TO PKZ;

    ALTER TABLE T22 RENAME CONSTRAINT SYS_C0011412 TO PK2222;

    CREATE TABLE T25

    (

        C1 NUMBER,

        C2 NUMBER,

        C3 NUMBER CONSTRAINT CON_3 NOT NULL,

        C4 NUMBER,

        C5 NUMBER CONSTRAINT CON_5 CHECK(C5>900),

        C6 NUMBER CONSTRAINT CON_6 UNIQUE,

        CONSTRAINT CON_1 PRIMARY KEY(C1,C2),

        CONSTRAINT CON_4 FOREIGN KEY(C4,C5) REFERENCES T25(C1,C2)

        );

    ALTER TABLE T25 ADD C7 NUMBER;

    ALTER TABLE T25 ADD C7 NUMBER;

    desc t25;

    ALTER TABLE T25 DROP COLUMN C3 CASCADE CONSTRAINT;删除列同时删除约束

    ALTER TABLE T25 DISABLE CONSTRAINT CON_1 CASCADE;----启用约束

    ALTER TABLE T25 ENABLE CONSTRAINT CON_1 CASCADE;----禁用约束

    ALTER TABLE T25 DROP CONSTRAINT CON_6;----删除约束

  • 相关阅读:
    Docker系统知识整理(从安装到熟练操作)
    Dockerfile 文件介绍
    Cmake命令之add_subdirectory介绍
    Cmake实战指南
    cmake的四个命令:add_compile_options、add_definitions、target_compile_definitions、build_command
    cmake:选择编译器及设置编译器选项
    Task异常
    单元测试误区
    网络的核心概念
    java~使用枚举来实现接口的多态
  • 原文地址:https://www.cnblogs.com/kawashibara/p/9038213.html
Copyright © 2011-2022 走看看