zoukankan      html  css  js  c++  java
  • Oracle 学习笔记 10 -- 约束

    本次笔记来学习约束,约束在表中无处不在。

    比如,表中的数据不同意为空或者是表中id为设为主键,都是约束。

    约束分类:

            主键约束(PRIMARY KEY):主键表示表中一个唯一的标识,本身不能为空。

            唯一约束(UNIQUE):在一个表中仅仅能同意建立一个主键约束,其他的列不会与此列产生反复的值。

            检查约束(CHECK):检查一个列的内容是否合法,如:工资在 1500 – 3000之间。

            非空约束(NOT NULL):内容不能为空。

            外键约束(FOREIGN KEY):两张表之间的进行约束操作。

    约束也是有名字的。假设不指定约束的名字,系统会自己主动的为我们重建约束名。格式相似于sys_cn 。也能够自己创

    建约束的名字,格式一般为:constraint  表名_列名_约束名 约束。之所以使用 “表名_列名_约束名”这种格式。

    也是为了达到一种见名知意的效果。定义的方式:列约束必须跟在列的后面进行定义。表级约束能够不跟在列的后面,进行单独的定义。

    约束的范围:列级约束和表级约束。列级约束仅仅能作用在一个列上。表级约束能够作用在多个列上,也能够作用在一个列上。

    能够创建约束,也能够改动约束。

    创建约束在创建表的时候创建。改动约束在表创建完毕之后再进行改动。

    主要的语法格式:

    列级约束定义:

    CREATE TABLE table_name(

           列名1 列的数据类型类型  [约束 | constraint 约束名称  约束],

      列名2 列的数据类型类型  [约束 | constraint 约束名称  约束]

    )

    表级约束定义:

    CREATE TABLE table_name(

             列名1  列的数据类型 。

          列名2  列的数据类型 ,

          constraint  约束名称 约束(列名)

    )

    NOT NULL 约束

    非空的约束仅仅能定义在列上。使用非空约束,表示一个字段的内容不同意为空,即:插入的数据必须是有内容

    的,不同意为null 。

    例:创建表emp2 ,表中包括三列。id , name  。 salary 。当中要求id 列不能为空。

    create table emp2(

           idnumber(9) constraintemp2_id_nn  not null ,

           namevarchar2(20) not null ,

           salarynumber(10 ,2 )

    )

    constraintemp2_id_nn 列级约束。意思是为约束起一个名字。使用constraintkeyword来进行定义。

    例:数据測试,尝试向emp2中加入name为null的数据

    insert into emp2

    values(1001 , null , 2000)

     

    ORA-01400: 无法将 NULL 插入 ("SCOTT"."EMP2"."NAME")

    设置非空约束之后。假设插入空值,则出现上述错误。已经指名了列名name无法插入空值。

    唯一约束(UNIQUE)

    列的值是唯一的,在表中的其他列中不同意有反复的值。

    可是同意表中出现多个null值。

    例:创建表emp3

    create table emp3

    (

           idnumber(8) constraintemp3_id_uk unique ,

           namevarchar2(20) constraintemp3_name_nn not null ,

           salarynumber(10,2),

           emailvarchar2(20),

           --表级约束

           constraintemp3_email_uk unique(email)

    )

    运行以下的语句两次之后:

    insert into emp3

    values(100 , 'zhangsan1' ,2000, 'zhang@128.com' )

     

    ORA-00001: 违反唯一约束条件 (SCOTT.EMP3_ID_UK),提示违反了唯一的约束。可是假设插入值得集合为(100 。 'zhang' , 2000 , null)和(1001 ,'san' , 3000 , null)的两条数据。尽管上面两个值得集合中email列中都是空值,仍然能够成功插入。设置了唯一约束的列,null不觉得是反复。

    主键约束(PRIMARY KEY)

    一般使用在表的id上面,本身默认内容不能为空。

    create table emp4

    (

           idnumber(8) constraintemp4_id_pk primary key  ,

           namevarchar2(20) constraintemp4_name_nn not null ,

           salarynumber(10,2),

           emailvarchar2(20),

          

           --表级约束

           constraintemp4_email_ukunique(email)

    )

    insert into emp4values(null , 'zhangsan' ,100 ,'125')

    ORA-01400: 无法将 NULL 插入 ("SCOTT"."EMP4"."ID")

    insert into emp4values(1001 , 'zhangsan' ,100 ,'125')

    ORA-00001: 违反唯一约束条件 (SCOTT.EMP4_ID_PK)

    当表中已经存在id 为1001 的记录时。依旧不能插入数据。

    设置了主键的约束,值不是不同意为空和反复的。

    外键约束(FOREIGN KEY)

    外键约束是针对两张表的约束。在字表中设置的外键,在主表中必须设置成主键。

    再删除是,应该先删除子表的记录在删除父表的记录。

    创建外键约束语句:

    constraint 约束名称  foreign key (子表列名) references 父表名(父表列名)。子表列名和父表列名应该同样。

    create table emp8

    (

           idnumber(8) ,

           name varchar2(20) constraintemp8_name_nn not null ,

           salary number(10,2) check (salary >1500 and salary < 30000),

           email varchar2(20),

           department_id number(10),

           --表级约束

           constraintemp8_email_uk unique(email) ,

           constraintemp8_id_pk primary key (id),

           constraintemp8_dept_id_fk  foreignkey (department_id) references  

           departments(department_id)

    )

    insert into emp6

    values (1001 , 'aa' ,null , 2000 ,2000)

    ORA-02291:违反完整约束条件 (SCOTT.EMP6_DEPT_ID_FK) -未找到父项keyword 。

    上面deptment_id = 2000 在deptments表中是不存在的,则是出现上述错误。

    设置了外键约束之后,字表中的列受到父表的约束,假设是父表中没有的值 。那么数据便不能插入成功。

     

    –ON DELETE CASCADE(级联删除): 当父表中的列被删除时。子表中相相应的列也被删除
     
    –ON DELETE SET NULL(级联置空): 子表中相应的列置空

     

    Check 约束

                 使用check约束。检查一个类中插入的内容是否合法。如工资在1500 - 5000 之间。

    create table emp8

    (

           id number(8) ,

           name varchar2(20) constraint emp8_name_nn not null ,

           salary number(10,2) check (salary >1500 and salary < 30000),

           email varchar2(20),

           department_id number(10),

           --表级约束

           constraint emp8_email_ukunique(email) ,

           constraint emp8_id_pkprimarykey (id),

           constraint emp8_dept_id_fk  foreign key (department_id)

           references departments(department_id)

    )

    SQL> insert into emp8

     2  values(1001 , 'zhangsan' , 2000 , 'aa' , 30) ;

     1 row inserted

     

    SQL> insert into emp8

     2  values(1002 ,'zhang' , 500 , 'bb' , 30);

    ORA-02290:违反检查约束条件 (SCOTT.SYS_C005496),当插入的数据不满足salary的范围便会出上述错误提示。

    改动约束

    改动约束

    加入 not null 约束  要使用 modify

    Alter table emp5

    Modify(salary number(10) not  null )

    删除约束 

    Alter table emp5

    Drop constraint emp5_name_nn(约束名)

    加入约束

    Alter table emp5

    Add constraint emp5_nameul unique(name);

     

    有效化约束和无效化约束。

    Alter table emp3

    enable constraint emp3——name-uk (约束名)

     

    Alter table emp3

    Disable constraint emp3——name-uk (约束名)

  • 相关阅读:
    UVALive
    BZOJ2120:数颜色(数状数组套主席树)(带修改的莫对)
    BZOJ-3439:Kpm的MC密码(Trie+DFS序+主席树)
    51nod1674:区间的价值2(分治,利用&和|的收敛性)
    [CQOI2009]DANCE跳舞
    [HNOI2006]超级英雄
    Luogu1613 跑路
    [HZOI 2016]公路修建
    [NOI2014]魔法森林
    [HAOI2006] 旅行
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/8614948.html
Copyright © 2011-2022 走看看