# MySQL 约束类型
约束实际上就是表中数据的限制条件,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。比如name字段中要让其用户名不重复,这就需要添加约束。或者必须注册的时候需要添加邮箱等。
MYSQL中,常用的几种约束:

约束类型: 主键 外键 唯一 非空 自增 默认值
关键字: primary key foreign key unique not null auto_increment default

1、主键约束 primary key

主键约束相当于 唯一约束 + 非空约束 的组合,主键约束列不允许重复,也不允许出现空值。
但是主键和非空和唯一索引有本质不同。
主键约束除了可以做到”not null unique”之外,还会默认添加”索引——index”
每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别创建。
当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
表中的某个字段添加主键约束后,该字段为主键字段,主键字段中出现的每一个数据都称为主键值。
一张表应该有主键字段,如果没有,表示该表无效
主键值:是当前行数据的唯一标识、是当前行数据的身份证号
即使表中两行记录相关数据相同,但由于主键值不同,所以也认为是两行不同的记录

-- 基本模式
create table temp(
id int primary key,
name varchar(20)
);
-- 组合模式
create table temp(
id int ,
name varchar(20),
pwd varchar(20),
primary key(id, name)
);
-- 删除主键约束
alter table temp drop primary key;
-- 添加主键约束
alter table temp add primary key(id,name);
-- 修改主键约束
alter  table temp modify id int primary key;

按主键约束的字段数量分类
单一主键:给一个字段添加主键约束
复合主键:给多个字段联合添加一个主键约束(只能用表级定义)
单一主键(列级定义)

mysql> create table t_user(-> id int(10) primary key,-> name varchar(32)-> );
Query OK, 0 rows affected (0.07 sec)

单一主键(表级定义)

mysql> create table t_user(-> id int(10),-> name varchar(32) not null,-> constraint t_user_id_pk primary key(id)-> );
Query OK, 0 rows affected (0.01 sec)

复合主键(表级定义)

mysql> create table t_user(-> id int(10),-> name varchar(32) not null,-> email varchar(128) unique,-> primary key(id,name)-> );
Query OK, 0 rows affected (0.05 sec)

在MySQL数据库提供了一个自增的数字,专门用来自动生成主键值,主键值不用用户维护,自动生成,自增数从1开始,以1递增(auto_increment)

mysql> create table t_user(-> id int(10) primary key auto_increment,-> name varchar(32) not null-> );
Query OK, 0 rows affected (0.03 sec)

插入两行记录,id主键值会自动增加

mysql> insert into t_user(name) values('jay');
Query OK, 1 row affected (0.04 sec)
mysql> insert into t_user(name) values('man');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t_user;
+----+------+
| id | name |
+----+------+
|  1 | jay  |
|  2 | man  |
+----+------+
2 rows in set (0.00 sec)

2、外键约束 foreign key

外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。

-- 基本模式
-- 主表
create table temp(
id int primary key,
name varchar(20)
);
-- 副表
create table temp2(
id int,
name varchar(20),
classes_id int,
foreign key(id) references temp(id)
);
-- 多列外键组合,必须用表级别约束语法
-- 主表
create table classes(
id int,
name varchar(20),
number int,
primary key(name,number)
);
-- 副表
create table student(
id int auto_increment primary key,
name varchar(20),
classes_name varchar(20),
classes_number int,
/*表级别联合外键*/
foreign key(classes_name, classes_number) references classes(name, number)
);
-- 删除外键约束
alter table student drop foreign key student_id;
-- 增加外键约束
alter table student add foreign key(classes_name, classes_number) references classes(name, number);

什么是外键
若有两个表A、B,id是A的主键,而B中也有id字段,则id就是表B的外键,外键约束主要用来维护两个表之间数据的一致性。
A为基本表,B为信息表
1、外键涉及到的术语
外键约束
外键字段
外键值
2、外键约束、外键字段、外键值之间的关系
某个字段添加外键约束之后,该字段称为外键字段,外键字段中每个数据都是外键值
3、按外键约束的字段数量分类
单一外键:给一个字段添加外键约束
复合外键:给多个字段联合添加一个外键约束
4、一张表可以有多个外键字段(与主键不同)
5、分析场景
设计数据库表,用来存储学生和班级信息
两种方案
方案一:将学生信息和班级信息存储到一张表

sno     sname      classno      cname
1       jay         100         浙江省第一中学高三1班
2       lucy        100         浙江省第一中学高三1班
3       king        200         浙江省第一中学高三2班

缺点:数据冗余,比如cname字段的数据重复太多
方案二:将学生信息和班级信息分开两张表存储
学生表(添加单一外键)

sno(pk)     sname       classno(fk)
1           jack        100
2           lucy        100
3           king        200

班级表

cno(pk)     cname
100         浙江省第一中学高三1班
200         浙江省第一中学高三2班

结论

为了保证学生表中的classno字段中的数据必须来自于班级表中的cno字段中的数据,有必要给学生表中的classno字段添加外键约束

注意点

  • 外键值可以为null
  • 外键字段去引用一张表的某个字段的时候,被引用的字段必须具有unique约束
  • 有了外键引用之后,表分为父表和子表
  • 班级表:父表
  • 学生表:子表
  • 创建先创建父表
  • 删除先删除子表数据
  • 插入先插入父表数据
    存储学生班级信息
mysql> drop table if exists t_student;
mysql> drop table if exists t_class;
mysql> create table t_class(-> cno int(10) primary key,-> cname varchar(128) not null unique-> );
mysql> create table t_student(-> sno int(10) primary key auto_increment,-> sname varchar(32) not null,-> classno int(3),-> foreign key(classno) references t_class(cno)-> );
mysql> insert into t_class(cno,cname) values(100,'aaaaaaxxxxxx');
mysql> insert into t_class(cno,cname) values(200,'oooooopppppp');
mysql> insert into t_student(sname,classno) values('jack',100);
mysql> insert into t_student(sname,classno) values('lucy',100);
mysql> insert into t_student(sname,classno) values('king',200);

班级表t_class

mysql> select * from t_class;
+-----+--------------+
| cno | cname        |
+-----+--------------+
| 100 | aaaaaaxxxxxx |
| 200 | oooooopppppp |
+-----+--------------+

学生表t_student

mysql> select * from t_student;
+-----+-------+---------+
| sno | sname | classno |
+-----+-------+---------+
|   1 | jack  |     100 |
|   2 | lucy  |     100 |
|   3 | king  |     200 |
+-----+-------+---------+

上表中找出每个学生的班级名称

mysql> select s.*,c.* from t_student s join t_class c on s.classno=c.cno;
+-----+-------+---------+-----+--------------+
| sno | sname | classno | cno | cname        |
+-----+-------+---------+-----+--------------+
|   1 | jack  |     100 | 100 | aaaaaaxxxxxx |
|   2 | lucy  |     100 | 100 | aaaaaaxxxxxx |
|   3 | king  |     200 | 200 | oooooopppppp |
+-----+-------+---------+-----+--------------+

3、 唯一约束unique

唯一约束是指定table的列或列组合不能重复,保证数据的唯一性。
唯一约束不允许出现重复的值,但是可以为多个null。
同一个表可以有多个唯一约束,多个列组合的约束。
在创建唯一约束时,如果不给唯一约束名称,就默认和列名相同。
唯一约束不仅可以在一个表内创建,而且可以同时多表创建组合唯一约束。

-- 创建表时设置,表示用户名、密码不能重复create table temp(id int not null ,name varchar(20),password varchar(10),unique(name,password)
);
-- 添加唯一约束
alter table temp add unique (name, password);
-- 修改唯一约束
alter table temp modify name varchar(25) unique;
-- 删除约束
alter table temp drop index name;

创建表,保证邮箱地址唯一(列级约束)

mysql> create table t_user(-> id int(10),-> name varchar(32) not null,-> email varchar(128) unique-> );
Query OK, 0 rows affected (0.03 sec)

表级约束

mysql> create table t_user(-> id int(10),-> name varchar(32) not null,-> email varchar(128),-> unique(email)-> );

如果插入相同email会报错

mysql> insert into t_user(id,name,email) values(1,'xlj','932834897@qq.com');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t_user(id,name,email) values(2,'jay','932834897@qq.com');
ERROR 1062 (23000): Duplicate entry '932834897@qq.com' for key 'email'

使用表级约束,给多个字段联合约束

联合约束,表示两个或以上的字段同时与另一条记录相等,则报错

mysql> create table t_user(-> id int(10),-> name varchar(32) not null,-> email varchar(128),-> unique(name,email)-> );
Query OK, 0 rows affected (0.01 sec)

插入第一条数据

mysql> insert into t_user(id,name,email) values(1,'xxx','qq.com');
Query OK, 1 row affected (0.05 sec)

插入第二条数据如果是与联合字段中的一条相同另一条相同,也是可以的

mysql> insert into t_user(id,name,email) values(2,'mmm','qq.com');
Query OK, 1 row affected (0.05 sec)

插入第三条数据,如果与联合字段都相同,则报错

mysql> insert into t_user(id,name,email) values(3,'mmm','qq.com');
ERROR 1062 (23000): Duplicate entry 'mmm-qq.com' for key 'name'

3、表级约束可以给约束起名字(方便以后通过这个名字来删除这个约束)

mysql> create table t_user(-> id int(10),-> name varchar(32) not null,-> email varchar(128),-> constraint t_user_email_unique unique(email)-> );
Query OK, 0 rows affected (0.06 sec)

constraint是约束关键字,t_user_email_unique自己取的名字

例:用户名既不能为空,也不能重复

name varchar(32) not null unique

4、非空约束 not null 与 默认值 default

非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。
用not null约束的字段不能为null值,必须给定具体的数据
Null类型特征:
  所有的类型的值都可以是null,包括int、float 等数据类型

-- 创建table表,ID 为非空约束,name 为非空约束 且默认值为abc
create table temp(id int not null,name varchar(255) not null default  'abc',sex char null
);
-- 增加非空约束
alter table temp
modify sex varchar(2) not null;
-- 取消非空约束
alter table temp modify sex varchar(2) null;
-- 取消非空约束,增加默认值
alter table temp modify sex varchar(2) default 'abc' null;

创建表,给字段添加非空约束(创建用户表,用户名不能为空)

    mysql> create table t_user(-> id int(10),-> name varchar(32) not null-> );
Query OK, 0 rows affected (0.08 sec)

如果没有插入name字段数据,则会报错

mysql> insert into t_user (id) values(1);
ERROR 1364 (HY000): Field 'name' doesn't have a default value

MySQL 约束类型相关推荐

  1. mysql约束类型 A P_sql数据类型与约束总结

    前言: 我们已经总结了sql的基本用法,经过上一篇文章单表的相关逻辑操作我们已经会了,但是我们搞后台通常会通过java(此处就以使用最多的java总结了) 搞一些数据然后换成mysql能够接受的数据类 ...

  2. mysql约束类型 A P_mysql笔记: 数据类型、约束、范式

    登陆mysql # mysql -uroot -p123456 # 显示数据库 SHOW DATABASES; # 创建数据库 CREATE DATABASE test; # 显示数据库中的表 SHO ...

  3. Mysql数据库---约束类型_MySQL约束类型及举例介绍

    约束 约束保证数据的完整性和一致性 约束分为表级约束和列级约束 约束类型包括:NOT NULL (非空约束),PRIMARY KEY(主键约束),UNIQUE KEY(唯一约束),DEFAULT(默认 ...

  4. Mysql数据库---约束类型

    Mysql数据库的约束类型有:主键约束(Primary Key),外键约束(Foreign Key),非空约束(Not Null),唯一性约束(Unique),默认约束(Default). 一.主键约 ...

  5. mysql 约束 域_MySQL-约束

    约束是对表的强制规定 数据完成性:实体完整性.域完整性.参照完整性 实体完整性:保证表中的每一行数据在表中是唯一的 域完整性:数据库中的列必须满足某种特定的数据类型或约束.约束又分为强制域完整性越苏. ...

  6. 20141230 mysql数值类型和列属性二

    20141230 mysql数值类型和列属性二 枚举字符串 枚举字符串指的是在定义之初就确定要存放的字符串有哪些,然后在数据进行存储的时候就只能存储已经定义过的字符串,只能使用任意的一个字符串.(单选 ...

  7. mysql myisam 支持事务吗_第三章(附)mysql表类型MyISAM和InnoDB区别(决定了是否支持事务)...

    mysql表类型MyISAM和InnoDB区别 MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问 ...

  8. 常见的6种MySQL约束

    摘要:一篇文章带你彻底了解MySQL各种约束 MySQL约束 <1> 概念 是一种限制,它是对表的行和列的数据做出约束,确保表中数据的完整性和唯一性. <2> 使用场景 创建表 ...

  9. 20141230 mysql数值类型和列属性一

    20141230 mysql数值类型和列属性一 回顾 数据库基础知识,关系型数据库(行/记录,列/字段,SQL) 基本SQL操作:库操作,表操作(字段)和数据操作 字符集 校对集 1. 什么是校对集? ...

最新文章

  1. 当CDN遇上对象存储:完美!
  2. IT兄弟连 Java语法教程 变量1
  3. 概括鸿蒙系统的优势,从开发语言分析鸿蒙系统有何优势
  4. RabbitMQ指南(上)
  5. Android利用canvas画各种图形
  6. 回车与换行 ASCII
  7. 海棠读社小程序研发(.Net Core版)
  8. 径向基神经网络_谷歌开源Neural Tangents:5行代码打造无限宽神经网络模型,帮助“打开ML黑匣子”...
  9. 字节跳动经营范围新增销售电子产品家用电器等
  10. ModuleNotFoundError: No module named 'tensorflow.python.saved_model.model_utils'
  11. 夏侯南溪搭建目标检测模型——文件结构设计篇
  12. JavaScript培训
  13. vst和vst3插件_用于家庭录音的经典VST插件
  14. 无键盘屏幕配置树莓派连接WiFi
  15. Java 中的三大特性(超详细篇)
  16. 联通智能城域网,到底有什么特别?
  17. 微信小程序:微擎开发飞鹅打印机配置
  18. VSCode 的扩展包C/C++ IntelliSense, debugging, and code browsing的IntelliSense功能无法使用,远程服务器linux上面的不能用
  19. Python求两个或三个正整数的最大公约数和最小公倍数
  20. 安全无污染的激活win7(官方)

热门文章

  1. 2021-08-31 openCV批量读取把 path0 里面的与 path 同名文件(.jpg)提取出来,然后生成.png放进 path1 路径里面
  2. 计算机组成原理——知识结构体系
  3. NeurIPS-21 | MGSSL: 基于官能团的分子属性预测图网络自监督预训练
  4. Windows10下安装配置 perl 环境
  5. 第六课.Python函数(三)
  6. Log.v Log.d Log.i Log.w Log.e作用的总结
  7. 文件bookDetails.html,查看源码: BookShopping.rar_bookdetails.jsp - VerySource
  8. ​北京大学吴华君组诚聘医学/生信助理研究员和博士后
  9. CSDN付费专栏写作感悟及成长之路、兼论学习会员模式的创作者协同效应
  10. python使用numpy包编写自定义函数计算MAPE(平均绝对百分比误差)指标mean absolute percentage error (MAPE)、MAPE指标解读、MAPE指标使用的注意事项