删除列级完整性约束_MySQL中的数据完整性约束
原标题: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中的数据完整性约束相关推荐
- 数据库中的数据完整性约束
这篇文章讲的是数据库中的数据完整性约束,如有错误或不当之处,还望各位大神批评指正. 什么是数据完整性约束? 数据完整性:存储在数据库中的所有数据值均正确的状态.它是应防止数据库中存在不符合语义规定的数 ...
- SQL语言基础:SQL中的数据完整性约束用法
前言 数据库的完整性是指数据库正确性和相容性,是防止合法用户使用数据库时向数据库加入不符合语义的数据,从而保证了数据库中的数据是正确的,避免非法的更新操作. 1.主键约束 1.1 完整性约束条件 完整 ...
- mysql 几级缓存_Mysql中一级缓存二级缓存区别
一级缓存: 也称本地缓存,sqlSession级别的缓存.一级缓存是一直开启的:与数据库同一次会话期间查询到的数据会放在本地缓存中. 如果需要获取相同的数据,直接从缓存中拿,不会再查数据库. 一级缓存 ...
- mysql数据库命令 单选_mysql中创建数据库命令是?_学小易找答案
[单选题]NH4NO2分解得氮气和水,在23°C,95549.5 Pa 条件下,用排水集气法收集到57.5 cm3氮气.已知水的饱和蒸气压为2813.1 Pa,则干燥后氮气的体积为() [填空题]在相 ...
- mysql中如何统计数据_mysql中的数据统计方法
1 数据统计 使用COUNT()函数计算表中的数据数目(比如emp表中的员工数目) mysql> select count(*) from emp; 查询结果如下: +----------+ | ...
- mysql教程中插入语句_mysql中插入数据Insert into语句用法
在mysql中要向数据库中保存数据我们最常用的一种方法就是直接使用Insert into语句来实现了,下面我来给大家详细介绍Insert into语句用法 INSERT用于向一个已有的表中插入新行.I ...
- mysql 导入数据库sql语句_mysql中导入数据与导出数据库sql语句
本文章来详细介绍关于mysql中导入数据与导出数据库sql语句,在mysql中常用的导入与导出数据的命令有source与mysqldump大家可参考. 1.例1:连接到本机上的MYSQL 首先在打开D ...
- mysql insert 指定列_MySQL中插入数据列到特定列
MySQL中插入数据列的命令alter table tablename add column_definition,如果不指定数据列的位置的时候,插入的列一般在最后,如 MySQL中插入数据列的命令 ...
- mysql改存储引擎教程_MySQL中修改数据表存储引擎的三种方法
第一种方法:ALTER TABLE 将表从一个引擎修改为另一个引擎最简单的办法是使用ALTER TABLE语句,转换表的存储引擎会导致失去原引擎相关的所有特性. 例:将mytable的引擎修改为Inn ...
最新文章
- 使用idea新建maven工程的web项目的步骤
- 面试季,Java中的static关键字解析
- Find Code for Research Papers
- 暑假N天乐【比赛篇】 —— 2019杭电暑期多校训练营(第四场)
- SoaBox 1.1.6 GA 发布,SOA 模拟环境
- Synchronize和Lock 的区别与用法
- asp.net mvc 接入阿里大于 短信验证码发送
- SparkJavaAPI:join的使用
- 精心挑选的23款美轮美奂的 jQuery 图片特效插件
- 批处理定时mysql备份数据库_定时备份mysql数据库的批处理
- MySQL无中心化集群_MySQL Plus 如何做到无中心化、数据强一致性、秒级切换?
- rust投递箱连接箱子_拆了的快递包装丢哪里?闵行试行24小时开放的网购包装回收箱...
- WebService 出现因 URL 意外地以“/HelloWorld”结束,请求格式无法识别。
- 在Linux命令行发送电子邮件附件的两种方法
- python 其他语言_谈谈Python和其他语言的区别
- Linux下载的详细教程
- RAID磁盘阵列详解
- PHP处理微信昵称emoji表情符号和特殊颜文字符
- 通用后台管理系统前端界面Ⅺ——信息列表页(弹窗复用增改、CRUD前端基础实现)
- 《Excel大神上分攻略》学习笔记3——函数求和及常见函数
热门文章
- 到底要不要拥抱 Spring Boot 3.0
- pyqt5实现导航栏
- python 取余问题(%)详解
- 用C#SDK实现百度云OCR的文字识别
- [附源码]Python计算机毕业设计车险管理系统
- ​在分类中如何处理训练集中不平衡问题​
- tp3.2中微信支付
- CA法模拟动态再结晶,晶粒正常长大,利用元胞自动机生成拓扑晶粒模型,参数可调
- python读取邮箱邮件_Python实现读取邮箱中的邮件功能示例【含文本及附件】
- @JsonFormat 和 @DateTimeFormat 的区别与使用?