数据库表的约束constraints

  • 数据完整性约束

    • 表的数据有一定的取值范围和联系,多表之间的数据有时也有一定的参照关系。
    • 在创建表和修改表时,可通过定义约束条件来保证数据的完整性和一致性。
    • 约束条件是一些规则,在对数据进行插入、删除和修改时要对这些规则进行验证,从而起到约束作用。
  • 完整性约束分类
    • 域完整性约束(非空not null,检查check)
    • 实体完整性约束(唯一unique,主键primary key)
    • 参照完整性约束(外键foreign key)

约束类型

说明

主键约束(Primary Key)

要求主键列数据唯一,并且不允许为空。主键可以包含表的一列或多列,如果包含表的多列,则需要在表级定义。

唯一约束(Unique)

要求该列唯一,允许为空,但只能出现一个空值

检查约束(Check)

某列取值范围限制、格式限制等,如年龄的约束

非空约束(not null)

某类内容不能为空

外键约束(Foreign Key)

用于两表间建立关系,需要指定引用主表的那列。外键通常用来约束两个表之间的数据关系,定义外键的那张表称为子表,另一张表称为主表。

在表的创建过程中,应该先创建主表,后创建子表。

  • 创建约束的时机

    • 在建表的同时创建
    • 建表后创建
  • 约束从作用上分类,可以分成两大类:
    • 表级约束:可以约束表中的任意一列或多列。可以定义出了Not Null以外的任何约束。
    • 列级约束:只能约束其所在的某一列。可以定义任何约束。
  • 命名规则推荐采用:约束类型_约束字段
    • 非空约束     NN__表名列名
    • 唯一约束     UK_表名_列名
    • 主键约束     PK_表名
    • 外键约束     FK_表名_列名
    • 检查约束     CK_表名_列名
  • 主键约束

    • 主键约束是数据库中最重要的一种约束。在关系中,主键值不可为空,也不允许出现重复,即关系要满足实体完整性规则。
    • 主键从功能上看相当于非空且唯一
    • 一个表中只允许一个主键
    • 主键是表中能够唯一确定一个行数据的字段
    • 主键字段可以是单字段或者是多字段的组合
    • Oracle为主键创建对应的唯一性索引

    create table t3(

        id number(4),  --primary key,

       constraint t3_pk primary key(id)  ---可自己给约束起名 t3_pk

      )

  • 唯一性约束

    • 唯一性约束条件确保所在的字段或者字段组合不出现重复值
    • 唯一性约束条件的字段允许出现空值,且可以多个空值
    • Oracle将为唯一性约束条件创建对应的唯一性索引

     CREATE TABLE employees(

        id      NUMBER(6),

               name        VARCHAR2(25) NOT NULL UNIQUE,

             email            VARCHAR2(25),

          alary           NUMBER(8,2),

         hire_date        DATE NOT NULL,

        CONSTRAINT emp_email_uk UNIQUE(email)

    );

  • 非空约束

    • 确保字段值不允许为空
    • 只能在字段级定义

CREATE TABLE employees(

employee_id    NUMBER(6),

name      VARCHAR2(25) NOT NULL,

salary         NUMBER(8,2),

hire_date      DATE CONSTRAINT emp_hire_date_nn NOT NULL

)

  • Check约束

    • Check约束用于对一个属性的值加以限制
    • 在check中定义检查的条件表达式,数据需要符合设置的条件

  create table emp3

  (        id number(4) primary key,

     age number(2)  check(age > 0 and age < 100),

      salary number(7,2),

  sex char(1),

   constraint salary_check check(salary > 0)

  )

  • 在这种约束下,插入记录或修改记录时,系统要测试新的记录的值是否满足条件
  • 外键约束

    • 外键是表中的一个列,其值必须在另一表的主键或者唯一键中列出
    • 作为主键的表称为“主表”,作为外键的关系称为“依赖表”
    • 外键参照的是主表的主键或者唯一键
    • 对于主表的删除和修改主键值的操作,会对依赖关系产生影响,以删除为例:当要删除主表的某个记录(即删除一个主键值,那么对依赖的影响可采取下列3种做法:FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO)
      • RESTRICT方式:只有当依赖表中没有一个外键值与要删除的主表中主键值相对应时,才可执行删除操作。
      • CASCADE方式:将依赖表中所有外键值与主表中要删除的主键值相对应的记录一起删除
      • SET NULL方式:将依赖表中所有与主表中被删除的主键值相对应的外键值设为空值
    • [ON DELETE [CASCADE|SET NULL]] 如省略on短语,缺省为第一中处理方式。
  • 添加约束

    • ALTER TABLE 表名
    • ADD CONSTRAINT 约束名  约束类型  具体的约束说明
  • 删除约束
    • ALTER TABLE 表名
    • DROP CONSTRAINT 约束名
  • 可增加或删除约束,但不能直接修改

数据库表的约束constraints的更多相关文章

  1. Oracle_数据库表的约束

    Oracle_数据库表的约束 完整性约束分类 域完整性约束 (非空not null,检查check) 实体完整性约束 (唯一unique,主键primary key) 参照完整性约束 (外键forei ...

  2. DDL创建数据库,表以及约束(极客时间学习笔记)

    DDL DDL是DBMS的核心组件,是SQL的重要组成部分. DDL的正确性和稳定性是整个SQL发型的重要基础. DDL的基础语法及设计工具 DDL的英文是Data Definition Langua ...

  3. MySQL 表的约束与数据库设计

    DQL 查询语句 排序 # 单列排序 * 只按某一个字段进行排序,单列排序 # 组合排序 * 同时对多个字段进行排序,如果第1个字段相等,则按照第2个字段排序,依次类推 * 语法: # 具体操作 * ...

  4. Oracle 数据库表中已有重复数据添加唯一键(唯一约束)

    Oracle 数据库表中已有重复数据添加唯一键(唯一约束) 问题描述 以 demo 举例,模拟真实场景. 表 TEST_TABLE 有如下字段和数据:id 是主键,code 没有设置键和索引 ID C ...

  5. Python进阶----数据库引擎(InnoDB),表的创建,mysql的数据类型,mysql表的约束

    Python进阶----数据库引擎(InnoDB),表的创建,mysql的数据类型,mysql表的约束 一丶MySQL的存储引擎 什么是存储引擎:    MySQL中的数据用各种不同的技术存储在文件( ...

  6. 数据库之 MySQL --- 数据处理 之 表的约束与分页(七)

    个人博客网:https://wushaopei.github.io/    (你想要这里多有)     1.约束 :为了保证数据的一致性和完整性,SQL规范以约束的方式对表数据进行额外的条件限制 ​ ...

  7. SQLite 入门教程(三)好多约束 Constraints(转)

    转于: SQLite 入门教程(三)好多约束 Constraints 一.约束 Constraints 在上一篇随笔的结尾,我提到了约束, 但是在那里我把它翻译成了限定符,不太准确,这里先更正一下,应 ...

  8. SQLite 入门教程(三)好多约束 Constraints

    一.约束 Constraints 在上一篇随笔的结尾,我提到了约束, 但是在那里我把它翻译成了限定符,不太准确,这里先更正一下,应该翻译成约束更贴切一点. 那么什么是约束呢? 我们在数据库中存储数据的 ...

  9. 使用 hibernate 根据映射文件生成数据库表

    为了更好的显示效果,可以在hibernate.cfg.xml配置文件的<session-factory>标签里加入以下内容: 显示sql语句和格式化显示sql语句: <propert ...

随机推荐

  1. Solidity safesub防止溢出

    在Solidity中两个无符号整型数字相减结果如果为负则会溢出,很严重的问题.所以在做数字运算时可以用DSSafeAddSub来保证运算的安全. pragma solidity ^; import & ...

  2. 使用python进行汉语分词-乾颐堂

    目前我常常使用的分词有结巴分词.NLPIR分词等等 最近是在使用结巴分词,稍微做一下推荐,还是蛮好用的. 一.结巴分词简介 利用结巴分词进行中文分词,基本实现原理有三: 基于Trie树结构实现高效的词 ...

  3. easyui combogrid 多选加载,保存,显示代码

    1.调用代码 UTIL.SetDict($("#txt_ExcludeIndustry_"), "SECTOR_TYPE", true, true, funct ...

  4. Call to undefined function Think\C()

    Fatal error: Call to undefined function Think\C() in /alidata/www/default/2017/newyear/simplewind/Co ...

  5. 编写高质量代码改善C#程序的157个建议——建议62:避免嵌套异常

    建议62:避免嵌套异常 应该允许异常在调用堆栈上往上传,不要过多的使用catch,然后再throw.过多的使用catch会带来两个问题: 1)代码更多了.这看上去好像你根本不知道怎么处理异常,所以你总 ...

  6. unittest测试框架详谈及实操(四)

    测试套件 应用unittest的Test Suite特性,可以将不同的测试组成一个逻辑组,然后设置统一的测试套来一起执行测试.通过TestSuite.TestLoader类来创建测试套件,最后用Tes ...

  7. 分布式缓存系统Memcached简介与以及在.net下的实践(转)

    缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是不够灵 ...

  8. 20145233《网络对抗》Exp5 MSF基础应用

    20145233<网络对抗>Exp5 MSF基础应用 实验问题思考 什么是exploit,payload,encode exploit是发现了的可以利用的安全漏洞或者配置弱点,这类模块存储 ...

  9. [LeetCode 题解]: Roman to Interger

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given a ro ...

  10. 面试题:给定一个函数rand()能产生1到m之间的等概率随机数,产生1到n之间等概率的随机数?

    虽然TX的面试已经过去好几天了,然而惨痛的过程还历历在目.人生中第一次正式job面试就这么挂掉了.在于面试官的交流过程中,被问及了几个算法设计题,在今后几篇博文中,我一一总结与诸君分享. 1. 给定一 ...