MySQL完整性约束的定义与实例教程


Posted in MySQL onMay 30, 2021

完整性约束

完整性约束的定义

为了保证插入数据的正确性和合法性,给表中字段添加,除了 数据类型约束 以外的 其他约束条件 。

完整性约束的分类

实体完整性:记录之间不能重复。

  • 主键约束(primary key) :唯一并且不能为空
  • 唯一约束(unique) :唯一可以为空
  • 主键自增(auto_increment)

域完整性:数据库表的字段,必须符合某种特定的数据类型或约束。

  • 类型约束 :在创建表的时候,已经给每个字段添加类型了
  • 非空约束 :not null
  • 默认值 :default

引用完整性(参照完整性):一张表中字段的值,需要参考另外一张表中的值。

  • 添加外键约束:foreign key
  • 引用完整性会降低sql的执行效率,有时候能不用就不用。

主键约束(primary key)

  • 主键约束(primary key) :唯一并且不能为空;
  • 一张表只能有一个主键字段,但是可以有联合主键;

添加主键约束,有以下3种方式:

方式一:在创建表的同时,添加主键约束。
create table student(
    sid int primary key,
    sname varchar(20),
    age int
)charset=utf8;
-- 添加主键约束后,插入相同的sid,会报错。
insert into student(sid,sname,age) values (1,'张三',22);
insert into student(sid,sname,age) values (1,'李四',33);

方式二:在创建表的同时,添加主键约束,但是添加方式不同。
  "只有这种添加主键的方式,可以添加联合主键"
create table student(
    sid int,
    sname varchar(20),
    age int,
    primary key(sid)
)charset=utf8;

方式三:创建完表后,添加主键约束。
create table student(
    sid int,
    sname varchar(20),
    age int
)charset=utf8;                  
alter table student add primary key(sid);
-- constraint表示添加的是一个约束;      
-- pk_sid是给约束起一个名字;

单个主键和联合主键的区别

"单个主键"
    将表中某一个字段设置为主键,用这一个字段,来唯一确定一条记录。
    只要sid唯一不为空,每一行就是一条唯一的记录。
    primary key(sid)
    sid   sname   age
    1     张三    18
    2     张三    18  

"联合主键"
    将表中2个字段(或多个字段)设置为联合主键,用这2个字段(或多个字段),
    来唯一确定一条记录。
    这2个字段可以分别重复,只要不是同时重复即可。
    primary key(sid,classid)
    sid   classid   sname   age
    1     2         张三    18
    1     3         张三    18  
    2     4         李四    20
    3     4         王五    30
    -- 下面两条记录,联合字段同时重复,表示一条重复记录,插入时报错。
    5     5         李闯    25  
    5     5         王二    24

主键字段的挑选原则

  1. 通常选择无意义的字段作为主键字段,比如说表中记录每一行行号的id字段,就是无意义的字段,很适合作为主键
  2. 主键字段一般不会对其进行修改(像字段名、字段类型等)
  3. 经常变化的字段,有意义的字段,不适合作为主键

特别注意:当一个建表语句中,某个字段只有primary key限制,而没有使用主键自增 auto_increament
需要我们自己给主键字段插入值,否则会出现如下错误。 "ERROR 1364 (HY000): Field 'sid' doesn't have a default value"

但是我们上面说过,主键字段一般是不进行修改的,也就是说不要主动给他值,主键字段应该是让系
统默认赋值。这个在学习过 主键自增 后你就明白了。

记住: primary key 和 auto_increament 最好配合使用。

举例说明:

MySQL完整性约束的定义与实例教程

删除主键约束

alter table student drop primary key;

主键自增(auto_increment)

主键自增的含义和特点

见名知意,这个是用来 帮助主键自动添加值 的一个约束。上面我们说过,主键字段最好不要有任何改动,当然也包括给主键字段插入数值的时候,也不要手动去添加主键,而是让系统自动给主键字段进行赋值。主键自增有如下2个特点:

  1. 设置了主键自增后,主键值会从1开始,每次自增1。
  2. 以前用过的主键值,当你删除该行记录后,主键值仍然是一个新的值,并不会重复使用以前出现过的主键值。

对第二个特点的说明:

MySQL完整性约束的定义与实例教程

添加唯一约束,有以下2种方式:

方式一:创建表的时候,在添加主键的同时,添加主键自增。 
create table student(
   sid int primary key auto_increment,
   sname varchar(20),
   age int,
   idcard varchar(18) 
)charset=utf8;  
-- primary key和auto_increment配合使用,插入数据的时候,
-- 不需要给主键字段sid赋值了。
insert into student(sname,age) values ("张三",22),("李四",25);

方式二:创建完表后,给字段同时添加"主键和主键自增"。
create table student(
   sid int,
   sname varchar(20),
   age int,
   idcard varchar(18) 
)charset=utf8;  
-- 以下2种方式,均可以给字段同时添加"主键和主键自增"。
alter table student modify sid int primary key auto_increment;
alter table student change sid sid int primary key auto_increment;

删除主键自增

alter table student modify sid int primary key;

唯一约束(unique)

唯一性约束的含义

由于一张表中只能由一个主键。但是对于某些字段,像 身份证 这样的字段,肯定也是唯一的,我们不能又将其设置为主键(身份证字段属于有意义的字段),那么怎么保证它的唯一性呢?这就是接下来要讲述的 唯一约束 。注意:一张表可以有多个唯一约束。

添加唯一约束,有以下3种方式:

方式一:在创建表的同时,添加唯一约束。
create table student(
    sid int primary key key auto_increment,
    sname varchar(20),
   age int,
   idcard varchar(18) unique
)charset=utf8; 


方式二:在创建表的同时,添加唯一约束,但是添加方式不同。
  "只有这种添加主键的方式,可以添加联合主键"
create table student (
    sid int primary key auto_increment,
    sname varchar(20),
    age int,
    idcard varchar(18),
    unique(idcard)
)charset=utf8; 

方式三:创建完表后,添加唯一约束。
create table student (
    sid int primary key auto_increment,
    sname varchar(20),
    age int,
    idcard varchar(18)
)charset=utf8;                      
alter table student add unique(idcard);

-- 设置了唯一约束的字段,当插入相同的值,会报错。
insert into student(sname,age,idcard) values ("李四",18,"123456");
insert into student(sname,age,idcard) values ("王五",22,"123456");

删除唯一约束

删除唯一约束,使用的语句有点不同。
alter table student drop key idcard;

添加非空约束(not null)

添加非空约束

非空约束指的是我们给某个字段设置了非空约束后,当我们给该字段插入空值的时候,会报错。添加非空约束,有以下2种方式:

方式一:创建表的时候,给字段添加非空约束。 
create table student(
   sid int primary key auto_increment,
   sname varchar(20) not null,
   age int,
   idcard varchar(18) 
)charset=utf8;

方式二:创建完表后,给字段添加非空约束。
create table student(
   sid int primary key auto_increment,
   sname varchar(20),
   age int,
   idcard varchar(18) 
)charset=utf8;

-- 有以下两种添加方式。
alter table student modify sname varchar(20) not null;
alter table student change sname sname varchar(20) not null;

字段添加非空约束后具有如下特点

  1. 字段设置了非空约束后,你不能插入null值。
  2. 字段设置了非空约束后,不但不能插入null值,而且还不能不插入值
"这些细节知识,有时候是我们没有注意到的,因此单独拿出来说明。"
一:字段设置了非空约束后,你不能插入null值。
-- 下面这样插入会报错。
insert into student(sname,age) values (null,22);

二:字段设置了非空约束后,不但不能插入null值,而且还不能不插入值。
-- 下面这样插入也会报错。
insert into student(age,idcard) values (33,"123456789");

举例如下:

MySQL完整性约束的定义与实例教程

添加默认值约束(default)

某个字段当被设置了 默认值 以后,当我们不为该字段指定值的时候,就会显示这个默认值。

添加默认值约束

方式一:创建表的时候,给字段添加默认值。 
create table student(
   sid int primary key auto_increment,
   sname varchar(20),
   age int default 0,
   idcard varchar(18)
)charset=utf8;

方式二:创建完表后,给字段添加默认值。
create table student(
   sid int primary key auto_increment,
   sname varchar(20),
   age int,
   idcard varchar(18)
)charset=utf8;
"不同点,需要特别留意"
-- 使用alter添加默认值的代码有点特别。
alter table student alter age set default 0;

删除默认值

alter table student alter column age drop default;

引用完整性(参照完整性)

什么是引用完整性?

引用完整性指的是,一张表中字段的取值,需要参照另一张表中某个字段的取值。这里涉及到的就是 外键 : foreign key 。一般情况下,本表中的这个字段设置的是外键 foreign key ,参考表中的那个字段的取值,就需要设置为那个表的主键。

参考下图帮助理解:

MySQL完整性约束的定义与实例教程

特别注意:学生表中的 cid 参考的是班级表中的 cid ,可以看到,这里的字段名是完全一样的。但是,实际上,这两个字段名可以不一样,但是这两个字段的数据类型必须是一样的

构成引用完整性的条件:

  1. 一张表(参照表)中的某个字段,参照另一张表(被参照表)中的字段(字段名可以不同)。
  2. 两张表中的字段名可以不同,但是字段的数据类型必须一致。
  3. 参照表中的字段在该表中是 foreign key 。被参照表中的字段在该表中是 primary key 。

添加外键约束(foreign key)

需要记住一句话:先有被引用的表,然后才可以给当前表添加外键约束,否则,你引用谁去?

添加外键约束,有以下2种方式:

方式一:创建表的时候,给字段添加外键约束。 
create table classroom(
    cid int primary key auto_increment,
    cname varchar(20) not null
)charset=utf8;

create table student(
   sid int primary key auto_increment,
   sname varchar(20) not null,
   age bit(1),
   cid int,
   constraint fk_cid foreign key(cid) references classroom(cid)
)charset=utf8;

方式二:创建完表后,给字段添加外键约束。
create table classroom(
    cid int primary key,
    cname varchar(20) not null
)charset=utf8;

create table student(
    sid int primary key auto_increment,
    sname varchar(20) not null,
    age bit(1),
    cid int
)charset=utf8;

alter table student add constraint fk_cid foreign key(cid)
references classroom(cid);
"注意:constraint后面接的是别名,fk_cid相当于起的别名。"

总结

到此这篇关于MySQL完整性约束的文章就介绍到这了,更多相关MySQL完整性约束内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL入门命令之函数-单行函数-流程控制函数
Apr 05 MySQL
MySQL表的增删改查基础教程
Apr 07 MySQL
mysql5.7使用binlog 恢复数据的方法
Jun 03 MySQL
MySQL5.7并行复制原理及实现
Jun 03 MySQL
mysql外连接与内连接查询的不同之处
Jun 03 MySQL
MySQL的全局锁和表级锁的具体使用
Aug 23 MySQL
Mysql实现简易版搜索引擎的示例代码
Aug 30 MySQL
MySQL修炼之联结与集合浅析
Oct 05 MySQL
MySQL的InnoDB存储引擎的数据页结构详解
Mar 03 MySQL
MYSQL优化之数据表碎片整理详解
Apr 03 MySQL
Mysql数据库事务的脏读幻读及不可重复读详解
May 30 MySQL
MySQL数据库查询之多表查询总结
Aug 05 MySQL
MySQL注入基础练习
解决Navicat for MySQL 连接 MySQL 报2005错误的问题
MYSQL(电话号码,身份证)数据脱敏的实现
May 28 #MySQL
MySql开发之自动同步表结构
mysql升级到5.7时,wordpress导数据报错1067的问题
May 27 #MySQL
解决Navicat for Mysql连接报错1251的问题(连接失败)
Navicat for MySQL的使用教程详解
You might like
php 计算两个时间戳相隔的时间的函数(小时)
2009/12/18 PHP
利用PHP实现图片等比例放大和缩小的方法详解
2013/06/06 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
2019/09/30 PHP
Javascript的一种模块模式
2008/03/22 Javascript
JavaScript 调试器简介
2009/02/21 Javascript
js获取location.href的参数实例代码
2013/08/02 Javascript
jQuery实现图片与文字描述左右滑动自动切换的方法
2015/07/27 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
jQuery选择器用法实例详解
2015/12/17 Javascript
javascript实现数字倒计时特效
2016/03/30 Javascript
AngularJS全局scope与Isolate scope通信用法示例
2016/11/22 Javascript
ztree实现权限横向显示功能
2017/05/20 Javascript
ES6学习教程之对象字面量详解
2017/10/09 Javascript
微信小程序版翻牌小游戏
2018/01/26 Javascript
常见的浏览器存储方式(cookie、localStorage、sessionStorage)
2019/05/07 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
vue中组件通信详解(父子组件, 爷孙组件, 兄弟组件)
2020/07/27 Javascript
python实现划词翻译
2020/04/23 Python
apache部署python程序出现503错误的解决方法
2017/07/24 Python
python os用法总结
2018/06/08 Python
python高级特性和高阶函数及使用详解
2018/10/17 Python
在python中按照特定顺序访问字典的方法详解
2018/12/14 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
Python3 获取文件属性的方式(时间、大小等)
2020/03/12 Python
python 实现压缩和解压缩的示例
2020/09/22 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
你不知道的葡萄干处理法、橙蜜处理法、二氧化碳酵母法
2021/03/17 冲泡冲煮
html5 canvas实现跟随鼠标旋转的箭头
2016/03/11 HTML / CSS
运动鞋、足球鞋和慕尼黑球衣:Sport Münzinger
2019/08/26 全球购物
英国珠宝网站Argento: PANDORA、Olivia Burton和Nomination等
2020/05/08 全球购物
面向对象概念面试题(.NET)
2016/11/04 面试题
大门门卫岗位职责
2013/11/30 职场文书
读书伴我成长演讲稿
2014/05/07 职场文书
经济管理自荐书
2014/06/09 职场文书
redis protocol通信协议及使用详解
2022/07/15 Redis