数据库表的约束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. 白盒测试实践-任务进度-Day03

    所使用静态代码检查工具 阿里巴巴Java开发代码检测IDE插件 小组成员 华同学.郭同学.覃同学.刘同学.穆同学.沈同学 任务进度 经过前期的学习和会议筹备,今天我们小组召开了代码评审会议.以下是今天 ...

  2. 39 编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)

    题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数) public class _039PrintFu ...

  3. How attach Java source(为eclipseIDE附加资源)

    In Eclipse, when you press Ctrl button and click on any  Class names, the IDE will take you to the s ...

  4. windows10个性化设置

    任务栏DIY 日期显示样式 字体

  5. Android 65536方法数限制的思考

    前言 没想到,65536真的很小. 1 Unable to execute dex: method ID not in [0, 0xffff]: 65536 PS:本文只是纯探索一下这个65K的来源, ...

  6. SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)(Finchley版本)

    在上一篇文章,讲了服务的注册和发现.在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式,一种是ribbon+r ...

  7. Android-获取网络图片设置壁纸

    下载图片,设置壁纸 的代码: package liudeli.async; import android.app.Activity; import android.app.ProgressDialog ...

  8. ArcGis Android 10.2.6更新文档翻译

    ArcGis Android 10.2.6更新文档翻译 @[ArcGis Android|10.2.6|更新文档] 本文描述了ArcGIS Runtime SDK for Android 10.2.6 ...

  9. mysql中判断记录是否存在方法比较【转】

    把数据写入到数据库的时,常常会碰到先要检测要插入的记录是否存在,然后决定是否要写入. 我这里总结了判断记录是否存在的常用方法: sql语句:select count(*) from tablename ...

  10. php获取数组的键值

    <?php header ( "Content-type: text/html; charset=utf-8" ); $info[; $info[; $info[; $inf ...