• 约束(主键、非空、唯一性、外键、检查约束)


    一、五种约束

    如果DML操作所涉及数据违反了已定义的约束,则数据库系统将拒绝执行这样的操作。

    Oracle数据库中,约束具体包括非空(NOT NULL)约束、唯一键(UNIQUE)约束、主键(PRIMARY KEY)约束、外键(FOREIGN KEY)约束和检查(CHECK)约束五种。

    和数据表类似,约束也属于数据库对象,可以在建表的同时创建其相关约束,也可以在建表后单独添加;可以由用户命名,也可以由系统按照默认格式自动对约束进行命名;按照约束的定义位置,又可以分为表级约束和字段级约束两种。

    建表的同时创建约束的的语法格式为:

    其中,column_constraint为字段级约束,字段级约束在字段定义时一并给出,也只能约束其所属的单个字段;table_constraints为表级约束,与表中的字段并列定义,可以约束单个或多个字段。

    1、非空约束(只能在字段级定义)

    例子:

    查询数据字典视图user_constraints可得到其具体名称,SQL语句如下:

    2、唯一性约束(列中最多有一个空值)

    Oracle会自动为唯一性约束的字段创建相应的唯一性索引。唯一性约束既可以在字段级定义、也可以在表级定义。

    如果要在两个或两个以上字段上定义联合唯一键(字段组合不允许出现空值),就只能定义为表级约束了,例如:

    3、主键约束(非空且唯一)

    只允许一个主键,主键可以是单个字段或多字段的组合(联合主键),Oracle会自动为主键字段创建对应的唯一性索引。主键约束既可以在字段级定义、也可以在表级定义。

    区别:主键是唯一的。

    联合主键只能定义为表级约束:

    4、外键约束

    表级、字段级均可。

    外键约束的特征:

    (1)子表外键字段的值必须在主表被参照字段值得范围内,或者为NULL;

    (2)外键参照的必须是主表的主键或唯一键(??);

    (3)主表主键/唯一键被子表参照时,主表相应记录不允许被删除。

    使用外键约束的相关原则:

    (1)创建数据表时,先创建主表,后创建子表;删除表的顺序相反;

    (2)添加数据时,先向主表中添加/插入记录,后向子表添加记录;删除数据操作顺序相反;

    (3)修改数据(UPDATE)的情况要复杂一些,通常使用触发器实现。

    外键约束可以和主键约束同时使用:

    外键约束也可能构建于同一个表内部的两个字段之间:

    5、检查约束

    表级、字段级均可。

    检查约束的条件表达式中不允许出现如下内容:
    - currval, nextval, level, rownum等伪劣
    - sysdate, uid, user, userenv等函数
    - 对其它字段值的引用

    其中, uid, user, userenv函数分别用于获取当前数据库用户ID,用户名及客户端计算机信息,如:

    二、约束管理

    1、查看约束

    如要查看当前用户的所有约束,可查询用户字典视图user_constrains:

    其返回结果中的"CONSTRAINT_TYPE"字段以缩写的方式标明约束条件的具体类型:"P"代表主键约束、 代表外键约束、"U"代表唯一键约束,检查和非空约束均使用"C"标明。

    如果想知道约束建立在哪个字段上,则需要查询用户字典视图user_cons_columns:

    2、添加约束(添加非空约束格式特别)

    建表后添加非空约束的格式有些特别——必须使用MODIFY子句添加,实际上是修改了整个字段的定义(也可以同时修改字段类型、缺省值等),例如:

    3、删除约束

    其中,CASCADE用于指定删除当前约束的级联约束。

    删除主键约束还有另外一种方式,其语法格式为:

    在删除约束时,如果还存在与该约束相关联的其他约束(如外键/关联)称为级联约束,则删除操作会失败,此时可使用CASCADE子句将其他关联约束一并删除。如:

    在删除表中字段时,如果该字段处于多字段联合约束条件(联合主键、联合唯一键、存在参照当前字段的外键)中,则删除会失败,此时可使用CASCADE CONSTRAINT子句将与该字段相关的约束一并删除。例如:

    4、禁用约束

    在ALTER TABLE语句中,还可以使用DISABLE CONSTRAINT子句禁用已有约束,即关闭数据校验功能,还可以使用CASCADE选项将相关联的约束一并禁用。其语法格式如下:

    相应地,可以使用ENABLE CONSTRAINT子句启用先前被禁用的约束,例如:

    和关闭约束操作的情形有所不同,此时无法再使用CASCADE选项一并启用相关联的其它约束。

  • 相关阅读:
    关于python3在centOS7下源码安装的配置
    nginx服务器多虚拟主机配置
    完全数
    高精度计算组合数
    算法竞赛入门经典第六章总结
    线段树
    奶牛
    算法竞赛入门经典第五章总结
    优先队列的使用方法
    放魔法石的游戏
  • 原文地址:https://www.cnblogs.com/CandiceW/p/10029573.html
Copyright © 2020-2023  润新知