原标题:MySQL中的数据完整性约束

作者:Airy 在数据分析之路狂奔,立志成为大咖级人物。

前面已经学习了常用数据类型和表的操作,其中表的操作中提到了数据完整性约束条件,今天来详细说一下各种完整性约束条件。

关系模型的完整性规则是对关系的某种约束条件。对关系模型施加完整性约束,是为了在数据库应用中保障数据的正确性和一致性,防止数据库中存在不符合语义、不正确的数据,这也是数据库服务器最重要的功能之一。

完整性约束既能防止对MySQL数据库的以外破坏和非法存取,又能提高完整性检测效率,也能减轻我们的负担。下面说一下关系模型中的三类完整性约束。

定义实体完整性

实体完整性规则(Entity Integrity Rule)是指关系的主属性不能取空值,即主键和候选键在关系中所对应的属性都不能取空值。MySQL中实体完整性就是通过主键约束和候选键约束来实现的。

1、主键约束

主键是表中某一列或某些列所构成的一个组合。能够唯一地标识表中的一条记录。主键约束(Primary Key Constraint)要求主键列的数据唯一,且不允许为空。

主键约束实现的两种方式:

一种是列级完整性约束,在表中某个字段定义后加上关键字PRIMARY KEY即可。如studentNo char(10) PRIMARY KEY,。

一种是表级完整性约束,需要在表中所有字段定义最后添加一条PRIMARY KEY(index_col_name, ...)。如PRIMARY KEY(studentNo)。

比如我们重新创建学生表:

CREATE TABLE tb_student(

studentNo CHAR(10) PRIMARY KEY,

studentName VARCHAR(20) NOT NULL,

sex CHAR(2),

birthday DATE,

native VARCHAR(20),

nation VARCHAR(20),

classNo CHAR(6)

)ENGINE=InnoDB;

2、完整性约束的命名

与数据库中的表一样,可以对完整性约束进行添加、删除和修改等操作。首先需要在定义约束时对其进行命名,命名完整性约束的方法是,在各种完整性约束的定义说明之前加关键字CONSTRAINT和该约束的名字,语法格式如下:

CONSTRAINT

{PRIMARY KEY (主键字段列表)

|UNIQUE (候选键字段列表)

| FOREIGN KEY (外键字段列表) REFERENCES tb_被参照关系(主键字段列表)

|CHECK(约束条件表达式)};

说明:symbol为指定的约束名字,必须是唯一的,默认MySQL会自动创建一个约束名字。

3、候选键约束

与主键一样,候选键可以是表中的某一列,也可以是表中某些列构成的一个组合。任何时候,候选键的值必须是唯一的,且不能为NULL,候选键可在CREATE TABLE 或ALTER TABLE语句中使用关键字UNIQUE来定义,实现方法与主键类似。看一个例子,创建班级表。

CREATE TABLE tb_class(

classNo CHAR(6) PRIMARY KEY,

className VARCHAR(20) NOT NULL UNIQUE,

department VARCHAR(30) NOT NULL,

grade SMALLINT,

classNum TINYINT

)ENGINE=InnoDB;

或者直接放在所有字段之后:CONSTRAINT UQ_class UNIQUE(className)。

MySQL中PRIMARY KEY 和UNIQUE之间的区别:

一个表只能创建一个PRIMARY KEY,但是可以定义多个UNIQUE。

定义PRIMARY KEY的列不允许有空值,定义UNIQUE的字段允许空值的存在。

定义PRIMARY KEY约束时,系统会自动产生PRIMARY KEY索引,而定义UNIQUE约束时,系统自动产生UNIQUE索引。

定义参照完整性

关系模型中实体与实体间的联系都是用关系来描述,因此可能存在着关系与关系间的引用。外键是一个表中的一个或一组属性,他不是这个表的主键,但是它对应另一个表的主键,外键的主要作用就是保证数据引用的完整性,保持数据的一致性。

参照完整性规则(Referential Integrity Rule)定义的是外键与主键之间的引用规则,即外键的取值或者为空,或者等于被参照关系中某个主键的值。

下面修改一下前面的学生表。

DROP TABLE tb_student;

CREATE TABLE tb_student(

studentNo CHAR(10),

studentName VARCHAR(20) NOT NULL,

sex CHAR(2),

birthday DATE,

native VARCHAR(20),

nation VARCHAR(20),

classNo CHAR(6) REFERENCES tb_class(classNo),

CONSTRAINT PK_student PRIMARY KEY(studentNo)

)ENGINE=InnoDB;

前面已经创建了表tb_class,而且classNo是主键,这里学生表里可以设置为外键,这个值参照班级表的主键classNo的值。

PS.外键只能引用主键和候选键。外键只可以用在使用存储引擎InnoDB创建的表中,其他的存储引擎不支持外键。

用户定义的完整性

除了前面两种完整性之外,还有一种特殊的约束条件,即用户定义的完整性规则(User-definedIntegrity Rule),它反映了某一具体应用所涉及的数据应满足的语义要求。

MySQL支持以下几种用户自定义完整性约束:

1、设置非空约束

非空约束是指设置的字段的值不能为空。比如之前我们添加的字段:studentNameVARCHAR(20) NOT NULL,中就设置了非空约束。

2、CHECK约束

与非空约束一样,也是在创建表或修改表的同时来定义的。CHECK约束需要指定限定条件,CHECK的语法是CHECK(expr);下面看一下实例,我们来创建一个课程表tb_course,并且设置约束,每16个课时对应1学分。

CREATE TABLE tb_course(

courseNo CHAR(10),

courseName VARCHAR(20) NOT NULL,

credit INT NOT NULL,

courseHour INT NOT NULL,

term CHAR(2),

priorCourse CHAR(6),

CONSTRAINT PK_course PRIMARY KEY(courseNo),

CONSTRAINT FK_course FOREIGN KEY(priorCourse)

REFERENCES tb_course(courseNo),

CONSTRAINT CK_course CHECK(credit= courseHour/16)

)ENGINE=InnoDB;

更新完整性约束

1、删除约束

DROP TABLE会删除所有完整性,但是并不经常这样做。看一下单独删除的语法。

删除外键约束

ALTER TABLE DROP FOREIGN KEY ;

删除主键约束

ALTER TABLE DROP PRIMARY KEY;

删除候选键约束

ALTER TABLE DROP {约束名|候选键字段名};

2、添加约束

添加主键约束

ALTER TABLE ADD [CONSTRAINT] PRIMARY KEY(主键字段);

添加外键约束

ALTER TABLE ADD [CONSTRAINT] FOREIGNKEY (外键字段) REFERENCES 被参照表(主键字段名);

添加候选键约束

ALTER TABLE ADD [CONSTRAINT] UNIQUE KEY(字段名);

大家可以手动测试一下。返回搜狐,查看更多

责任编辑:

删除列级完整性约束_MySQL中的数据完整性约束相关推荐

  1. 数据库中的数据完整性约束

    这篇文章讲的是数据库中的数据完整性约束,如有错误或不当之处,还望各位大神批评指正. 什么是数据完整性约束? 数据完整性:存储在数据库中的所有数据值均正确的状态.它是应防止数据库中存在不符合语义规定的数 ...

  2. SQL语言基础:SQL中的数据完整性约束用法

    前言 数据库的完整性是指数据库正确性和相容性,是防止合法用户使用数据库时向数据库加入不符合语义的数据,从而保证了数据库中的数据是正确的,避免非法的更新操作. 1.主键约束 1.1 完整性约束条件 完整 ...

  3. mysql 几级缓存_Mysql中一级缓存二级缓存区别

    一级缓存: 也称本地缓存,sqlSession级别的缓存.一级缓存是一直开启的:与数据库同一次会话期间查询到的数据会放在本地缓存中. 如果需要获取相同的数据,直接从缓存中拿,不会再查数据库. 一级缓存 ...

  4. mysql数据库命令 单选_mysql中创建数据库命令是?_学小易找答案

    [单选题]NH4NO2分解得氮气和水,在23°C,95549.5 Pa 条件下,用排水集气法收集到57.5 cm3氮气.已知水的饱和蒸气压为2813.1 Pa,则干燥后氮气的体积为() [填空题]在相 ...

  5. mysql中如何统计数据_mysql中的数据统计方法

    1 数据统计 使用COUNT()函数计算表中的数据数目(比如emp表中的员工数目) mysql> select count(*) from emp; 查询结果如下: +----------+ | ...

  6. mysql教程中插入语句_mysql中插入数据Insert into语句用法

    在mysql中要向数据库中保存数据我们最常用的一种方法就是直接使用Insert into语句来实现了,下面我来给大家详细介绍Insert into语句用法 INSERT用于向一个已有的表中插入新行.I ...

  7. mysql 导入数据库sql语句_mysql中导入数据与导出数据库sql语句

    本文章来详细介绍关于mysql中导入数据与导出数据库sql语句,在mysql中常用的导入与导出数据的命令有source与mysqldump大家可参考. 1.例1:连接到本机上的MYSQL 首先在打开D ...

  8. mysql insert 指定列_MySQL中插入数据列到特定列

    MySQL中插入数据列的命令alter table tablename add column_definition,如果不指定数据列的位置的时候,插入的列一般在最后,如 MySQL中插入数据列的命令 ...

  9. mysql改存储引擎教程_MySQL中修改数据表存储引擎的三种方法

    第一种方法:ALTER TABLE 将表从一个引擎修改为另一个引擎最简单的办法是使用ALTER TABLE语句,转换表的存储引擎会导致失去原引擎相关的所有特性. 例:将mytable的引擎修改为Inn ...

最新文章

  1. 使用idea新建maven工程的web项目的步骤
  2. 面试季,Java中的static关键字解析
  3. Find Code for Research Papers
  4. 暑假N天乐【比赛篇】 —— 2019杭电暑期多校训练营(第四场)
  5. SoaBox 1.1.6 GA 发布,SOA 模拟环境
  6. Synchronize和Lock 的区别与用法
  7. asp.net mvc 接入阿里大于 短信验证码发送
  8. SparkJavaAPI:join的使用
  9. 精心挑选的23款美轮美奂的 jQuery 图片特效插件
  10. 批处理定时mysql备份数据库_定时备份mysql数据库的批处理
  11. MySQL无中心化集群_MySQL Plus 如何做到无中心化、数据强一致性、秒级切换?
  12. rust投递箱连接箱子_拆了的快递包装丢哪里?闵行试行24小时开放的网购包装回收箱...
  13. WebService 出现因 URL 意外地以“/HelloWorld”结束,请求格式无法识别。
  14. 在Linux命令行发送电子邮件附件的两种方法
  15. python 其他语言_谈谈Python和其他语言的区别
  16. Linux下载的详细教程
  17. RAID磁盘阵列详解
  18. PHP处理微信昵称emoji表情符号和特殊颜文字符
  19. 通用后台管理系统前端界面Ⅺ——信息列表页(弹窗复用增改、CRUD前端基础实现)
  20. 《Excel大神上分攻略》学习笔记3——函数求和及常见函数

热门文章

  1. 到底要不要拥抱 Spring Boot 3.0
  2. pyqt5实现导航栏
  3. python 取余问题(%)详解
  4. 用C#SDK实现百度云OCR的文字识别
  5. [附源码]Python计算机毕业设计车险管理系统
  6. ​在分类中如何处理训练集中不平衡问题​
  7. tp3.2中微信支付
  8. CA法模拟动态再结晶,晶粒正常长大,利用元胞自动机生成拓扑晶粒模型,参数可调
  9. python读取邮箱邮件_Python实现读取邮箱中的邮件功能示例【含文本及附件】
  10. @JsonFormat 和 @DateTimeFormat 的区别与使用?