• 06-约束


    约束是表级的强制规定

    有以下五种约束:

      NOT NULL

      UNIQUE 

      PRIMARY KEY

      FOREIGN KEY

      CHECK

     

    如果不指定约束名 ,Oracle server 自动按照 SYS_Cn 的格式指定约束名。

    创建和修改约束:

          建表的同时

          建表之后

    可以在表级或列级定义约束。

    可以通过数据字典视图查看约束。

     

    作用范围:

    ①列级约束只能作用在一个列上

    ②表级约束可以作用在多个列上(当然表级约束也可以作用在一个列上)

    定义方式:列约束必须跟在列的定义后面,表约束不与列一起,而是单独定义。

    非空(not null) 约束只能定义在列上

     

    约束起名:constraint 约束名(表名_列名_约束简写)

    NOT NULL:非空;只能定义在列上;

    unique:唯一的,可插入null值,空值之间不违反唯一约束;

    表级约束:最后行,constraint  约束名 什么约束(作用哪列);

    primary key :不能为空,且唯一;

    foreign key: 外键;如:constraint 约束名 forekey key(哪列) references  表名(哪列);

    check: 列的限制 ;

     

     1 --NOT NULL 约束
     2 CREATE TABLE employees(
     3     employee_id    NUMBER(6),
     4     last_name      VARCHAR2(25) NOT NULL, --系统命名
     5     salary         NUMBER(8,2),
     6     commission_pct NUMBER(2,2),
     7     hire_date      DATE 
     8                    CONSTRAINT emp_hire_date_nn  --用户命名 
     9                    NOT NULL);
    10                    
    11 --UNIQUE 约束
    12 --唯一约束,允许出现多个空值:NULL。
    13 CREATE TABLE employees(
    14     employee_id      NUMBER(6),
    15     last_name        VARCHAR2(25) UNIQUE,--系统命名
    16     email            VARCHAR2(25),
    17     salary           NUMBER(8,2),
    18     commission_pct   NUMBER(2,2),
    19     hire_date        DATE NOT NULL,
    20     CONSTRAINT emp_email_uk UNIQUE(email) --用户命名 
    21     );
    22     
    23 --FOREIGN KEY 约束
    24 --FOREIGN KEY: 在表级指定子表中的列
    25 --REFERENCES: 标示在父表中的列
    26 --ON DELETE CASCADE(级联删除): 当父表中的列被删除时,子表中相对应的列也被删除
    27 --ON DELETE SET NULL(级联置空): 子表中相应的列置空
    28 CREATE TABLE employees(
    29     employee_id      NUMBER(6),
    30     last_name        VARCHAR2(25) NOT NULL,
    31     email            VARCHAR2(25),
    32     salary           NUMBER(8,2),
    33     commission_pct   NUMBER(2,2),
    34     hire_date        DATE NOT NULL,
    35     department_id    NUMBER(4),
    36     CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)
    37     REFERENCES departments(department_id) ON DELETE CASCADE,
    38     CONSTRAINT emp_email_uk UNIQUE(email));
    39 
    40 --CHECK 约束
    41 --定义每一行必须满足的条件
    42 CREATE TABLE employees(
    43     employee_id    NUMBER(6),
    44     last_name      VARCHAR2(25) NOT NULL, --系统命名
    45     salary         NUMBER(8,2) check(salary > 0 and salary < 1000000)
    46     );
    47 
    48 --添加约束的语法
    49 --使用 ALTER TABLE 语句:
    50 --添加或删除约束,但是不能修改约束
    51 --有效化或无效化约束
    52 --添加 NOT NULL 约束要使用 MODIFY 语句
    53 ALTER TABLE     employees
    54 ADD CONSTRAINT  emp_manager_fk 
    55   FOREIGN KEY(manager_id) 
    56   REFERENCES employees(employee_id);
    57 
    58 --删除约束
    59 ALTER TABLE      employees
    60 DROP CONSTRAINT  emp_manager_fk;
    61 
    62 --无效化约束
    63 ALTER TABLE        employees
    64 DISABLE CONSTRAINT    emp_emp_id_pk;
    65 
    66 --激活约束
    67 --当定义或激活UNIQUE 或 PRIMARY KEY 约束时系统会自动创建UNIQUE 或 PRIMARY KEY索引
    68 ALTER TABLE        employees
    69 ENABLE CONSTRAINT    emp_emp_id_pk;
    70 
    71 --查询约束
    72 --查询数据字典视图 USER_CONSTRAINTS
    73 SELECT    constraint_name, constraint_type,
    74     search_condition
    75 FROM    user_constraints
    76 WHERE    table_name = 'EMPLOYEES';
    77 
    78 --查询定义约束的列
    79 --查询数据字典视图 USER_CONS_COLUMNS
    80 SELECT    constraint_name, column_name
    81 FROM    user_cons_columns
    82 WHERE    table_name = 'EMPLOYEES';

      

    eg:

     1 --准备工作:
     2 create table emp2 as select employee_id id, last_name name, salary from employees;
     3 create table dept2 as select department_id id, department_name dept_name from departments;
     4 
     5 --向表emp2的id列中添加PRIMARY KEY约束(my_emp_id_pk)
     6 ALTER table emp2
     7 ADD constraint my_emp_id_pk primary key(id);
     8 
     9 --向表dept2的id列中添加PRIMARY KEY约束(my_dept_id_pk)
    10 ALTER table dept2
    11 ADD constraint my_dept_id_pk primary key(id);
    12 
    13 --向表emp2中添加列dept_id,并在其中定义FOREIGN KEY约束,与之相关联的列是dept2表中的id列。
    14 ALTER table emp2
    15 ADD (dept_id number(10) constraint emp2_dept_id_fk references dept2(id));
  • 相关阅读:
    漏洞都是怎么编号的CVE/CAN/BUGTRAQ/CNCVE/CNVD/CNNVD
    数据集成之主数据管理(一)基础概念篇
    hdu 4940 Destroy Transportation system(水过)
    关于C++ const 的全面总结
    UserManageSys
    malloc函数具体解释
    Haskell 差点儿无痛苦上手指南
    机房收费系统——附加数据库
    面向对象程序设计与面向过程程序设计解析
    java的System.getProperty()方法能够获取的值
  • 原文地址:https://www.cnblogs.com/shici/p/13428546.html
Copyright © 2020-2023  润新知