iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >『 MySQL篇 』:MySQL表的相关约束
  • 561
分享到

『 MySQL篇 』:MySQL表的相关约束

mysql数据库sql 2023-08-16 21:08:07 561人浏览 薄情痞子
摘要

基础篇 MySQL系列专栏(持续更新中 …)1『 MySQL篇 』:库操作、数据类型2『 MySQL篇 』:MySQL表的CURD操作3『 Mysql篇 』:mysql表的相关约束 文章目录 1 . 非空约束 (`not nu

基础篇 MySQL系列专栏(持续更新中 …)
1『 MySQL篇 』:库操作、数据类型
2『 MySQL篇 』:MySQL表的CURD操作
3Mysql篇 』:mysql表的相关约束

文章目录

)
  • 概述 : 约束是作用于表中字段上的限制,用于限制存储在表中的数据

  • 目的: 保证数据库中的数据的正确 , 有效性 和完整性

  • 分类

约束描述关键字
非空约束限制该字段的数据不能为 nullNOT NULL
唯一性约束保证该字段的所有数据都是唯一. 不重复的UNIQUE
主键约束主键是一行数据唯一的表示 , 要求非空且唯一PRIMARY KEY
默认约束保存数据时 ,如果未指定该字段的值 , 则采用默认值DEFAULT
检查约束(8.0.16版本之后)保证字段值满足某一个条件CHECK
外键约束用来让两张表的数据之间建立连接 , 保证数据的一致性和完整性FOREIGN KEY
1 . 非空约束 (not null)

创建表时进行使用 , 指定某一列的值不为空

create table 表名(列名 类型 not null);
  • 案例

创建表中包含 字段名为 name 字段类型为 varchar(10) , name 不允许为空值

mysql> create table user(name varchar(10) not null,gender char(1));Query OK, 0 rows affected (0.03 sec)mysql> desc user;+--------+-------------+------+-----+---------+-------+| Field  | Type        | Null | Key | Default | Extra |+--------+-------------+------+-----+---------+-------+| name   | varchar(10) | NO   |     | NULL    |       || gender | char(1)     | YES  |     | NULL    |       |+--------+-------------+------+-----+---------+-------+2 rows in set (0.01 sec)-- 插入姓名为空值时mysql> insert into user values(null,'男');ERROR 1048 (23000): Column 'name' cannot be nullmysql> insert into user values ('张三','男');Query OK, 1 row affected (0.00 sec)
2 . 唯一性约束(unique)

在创建表时 , 对某一列使用唯一性约束 , 则该列的值不能重复 .

create table 表名(列名 类型 unique);
  • 案例

创建表中包含字段名为 name , 字段类型为 varchar(10) , name 不允许为空值 . 且name 为唯一

mysql> create table user(name varchar(20)not null unique);  -- name 列不能重复且非空Query OK, 0 rows affected (0.05 sec)mysql> desc user;+-------+-------------+------+-----+---------+-------+| Field | Type        | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| name  | varchar(20) | NO   | PRI | NULL    |       |+-------+-------------+------+-----+---------+-------+1 row in set (0.00 sec)#第一次直接插入mysql> insert into user values('张三');Query OK, 1 row affected (0.00 sec)#当插入重复值时 , 已存在不能重复添加mysql> insert into user values('张三');ERROR 1062 (23000): Duplicate entry '张三' for key 'name'mysql>

如果没有指定非空 , 那么unique 字段可以有多个 null , 一张表中可以有多个unique 字段

  • 如果此时user 列已经创建 , 要将 唯一性约束添加到 name 列 , 则使用
# 修改user表中的约束alter table user modify age int not null unique;
3 . check约束

用于强制行数据必须满足的条件 .

  • oraclesql sever均支持check , 但是mysql 5.7 目前还不支持check , 只进行语法检验 ,并不会生效 .
4 . 默认约束(default)

在创建表的时候可以使用 , 可以设置列的默认值

create table 表名(列名 类型 default 默认值..);
  • 案例

创建表中包含字段名为sex , 字段类型为char( 1 ) , 约束条件为 默认值为 ‘男’

mysql> create table user(id int , gender char(1) default '男');Query OK, 0 rows affected (0.01 sec)mysql> desc user;+--------+---------+------+-----+---------+-------+| Field  | Type    | Null | Key | Default | Extra |+--------+---------+------+-----+---------+-------+| id     | int(11) | YES  |     | NULL    |       || gender | char(1) | YES  |     | 男      |       |+--------+---------+------+-----+---------+-------+2 rows in set (0.00 sec)
5 . 主键约束(primary key)

主键与外键之间的区别 ?

主键(主码) :主键用于唯一标识一个元组,不能有重复,不允许为空。一个表只能有一个主键。

外键(外码) :外键用来和其他表建立联系用,外键是另一表的主键,外键是可以有重复的,可以是空值。一个表可以有多个外键。

primary key 是主键约束 , 表由列和行组成。 通常,表具有一列或多列,列的值唯一地标识表中的每一行。 此列或多列称为主键。由两列或更多列组成的主键也称为复合主键。

create table 表名(列名 类型 primary key);
  • primary key 相当于not nullunique结合的效果 .
  • 在实际开发当中, 每个表通常都会设置一个主键 , 但允许多个列放到一起共同作为一个主键(联合主键)
  • 案例

创建表中包含字段名为 id , 字段类型为int , 其中 id为主键 ,不为空且唯一

mysql> create table user(id int primary key,name varchar(20));Query OK, 0 rows affected (0.05 sec)mysql> desc user;+-------+-------------+------+-----+---------+-------+| Field | Type        | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id    | int(11)     | NO   | PRI | NULL    |       || name  | varchar(20) | YES  |     | NULL    |       |+-------+-------------+------+-----+---------+-------+2 rows in set (0.01 sec)# 当插入两条主键相同的数据时,mysql> insert into user values(12,'张'),(12,'李');ERROR 1062 (23000): Duplicate entry '12' for key 'PRIMARY'

设置自增主键

MySQl 当中支持自增主键 , 在插入数据时 ,未设置初始值的情况下 , 会自动从 1 开始自增

create table 表名(列名 类型 primary key auto_increment, ...);
  • 案例
#将user表中的主键id 设置为自增主键mysql> create table user(id int primary key auto_increment,name varchar(20));Query OK, 0 rows affected (0.05 sec)mysql> desc user;+-------+-------------+------+-----+---------+----------------+| Field | Type        | Null | Key | Default | Extra          |+-------+-------------+------+-----+---------+----------------+| id    | int(11)     | NO   | PRI | NULL    | auto_increment || name  | varchar(20) | YES  |     | NULL    |                |+-------+-------------+------+-----+---------+----------------+2 rows in set (0.00 sec)mysql> insert into user values(null,'李'),(null,'张'),(null,'王');Query OK, 3 rows affected (0.01 sec)Records: 3  Duplicates: 0  Warnings: 0# 自增主键设置成功mysql> select * from user;+----+------+| id | name |+----+------+|  1 | 李   ||  2 | 张   ||  3 | 王   |+----+------+3 rows in set (0.00 sec)# id列的null并不是将id设置为null, 而是将id的赋值交给数据库来使用自增主键

MySQL当中数据量较大的时候 , 就需要使用多个主机进行储存, 本质上就是分表然后每个数据库服务器只储存一部分数据 , 这种情况下式就涉及到了"分布式系统中唯一id生成算法" , 利用不同时间下的时间戳和主机编号并结合随机因子 , 就可以得到唯一的id.

6 . 外键约束(foreign key)

外键用来让两张表的数据之间建立连接 , 从而保证数据的一致性和完整性 .

create table 表名(      字段名 数据类型,      foreign key(本表字段名) renferences 主表名(主键名或unique字段名))
alter table 添加外键的表名 add constraint 外键名称 foreign key(从表字段名) renferences 主表名(主表字段名)

外键约束常用来定义主表和从表的关系 , 外键约束定义在从表上 ,主表上必须具有主键约束或是unique约束

  • 外键约束演示
# 创建主班级表mysql> create table class(id int primary key comment'班级编号',                          name varchar(10) not null);Query OK, 0 rows affected (0.02 sec)# 创建学生表并建立外键约束mysql> create table student(id int primary key comment '学生编号',name varchar(20) not null,class_id int, -- 学生所在的班级编号foreign key(class_id) references class(id));Query OK, 0 rows affected (0.01 sec)# 主表副表结构mysql> desc class;+-------+-------------+------+-----+---------+-------+| Field | Type        | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id    | int(11)     | NO   | PRI | NULL    |       || name  | varchar(10) | NO   |     | NULL    |       |+-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)mysql> desc student;+----------+-------------+------+-----+---------+-------+| Field    | Type        | Null | Key | Default | Extra |+----------+-------------+------+-----+---------+-------+| id       | int(11)     | NO   | PRI | NULL    |       || name     | varchar(20) | NO   |     | NULL    |       || class_id | int(11)     | YES  | MUL | NULL    |       |+----------+-------------+------+-----+---------+-------+3 rows in set (0.00 sec)#班级表中插入数据mysql> INSERT INTO class values(100,'java'),   (200,'web');Query OK, 2 rows affected (0.01 sec)Records: 2  Duplicates: 0  Warnings: 0mysql> select * from class;+-----+------+| id  | name |+-----+------+| 100 | java || 200 | web  |+-----+------+#学生表插入数据mysql> insert into student values(1,'tom',100);Query OK, 1 row affected (0.02 sec)mysql> insert into student values(2,'jack',200);Query OK, 1 row affected (0.02 sec)#添加失败,300号班级在class表中不存在,由于外键约束的作用,插入失败mysql> insert into student values(3,'frx',300);ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`mytestdb`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))
  • 删除更新行为
行为说明(当在父表中删除/更新对应的记录时)
NO ACTioN检查该记录是否有对应外籍,如果有则不允许删除/更新
RESTRICT检查该记录是否有对应的外键,有则不允许删除/更新
CASCADE(级联)检查该记录是否有对应的外键,如果有,则也删除/更新外键在子表中的记录
SET NULL检查该记录是否有对应的外键,如果有则设置子表中该外键的值为NULL
SET DEFAULT父表有变更时,子表将外键列设置成一个默认的值(innodb不支持)
  • 格式
alter table 子表 add constraint 外键名 foreign key (字段名) references 父表(字段名) on update 行为 on delete 行为;
  • 示例

将 student 表中的外键删除更新行为设置为 update set null 和 delete set null

#设置 student 表中的外键mysql> alter table student add constraint class_id foreign key(class_id) references class(id) on update set null on delete set null;Query OK, 0 rows affected (0.05 sec)Records: 0  Duplicates: 0  Warnings: 0#更新父表中的 id mysql> update class set id = 300 where name = 'web';Query OK, 1 row affected (0.01 sec)Rows matched: 1  Changed: 1  Warnings: 0#查询子表中的全部信息mysql> select * from student;+----+------+----------+| id | name | class_id |+----+------+----------+|  1 | tom  |      100 ||  2 | jack |     NULL |+----+------+----------+2 rows in set (0.00 sec)
  • 删除外键约束

定义的任何约束可以使用带有DROP CONSTRAINT选项的ALTER TABLE命令删除 ,

ALTER TABLE table_name DROP CONSTRAINT fk_name;

如果使用的是MySQL,则可以使用更清晰的语法,如下所示:

ALTER TABLE table_name  DROP FOREIGN KEY fk_name;

示例:

-#删除外键约束mysql> alter table student drop foreign key class_id;Query OK, 0 rows affected (0.04 sec)Records: 0  Duplicates: 0  Warnings: 0#删除外键约束后,主表与从表再无关联,成功插入mysql> insert into student values(100,'张',550);Query OK, 1 row affected (0.00 se
  • 实际开发中 , 为什么不推荐使用外键 与级联?

一方面 , 外键的使用保证了数据库中数据的一致性和完整性 , 并且级联操作方便,减少了程序的代码量

另一方面 , 每次进行 update 和 delete 都需要考虑外键约束 , 导致测试数据极不方便 , 主从关系是确定的,如果哪天需求发生变化 , 会增加很多麻烦 .

所以 , 外键与级联更新适用于单机低并发,不适合分布式高并发集群; 级联更新是强阻塞,存在数据库更新风暴的风 险; 外键影响数据库的插入速度 , 并发量不是很高的情况下可以使用外键


来源地址:https://blog.csdn.net/m0_56361048/article/details/128769643

您可能感兴趣的文档:

--结束END--

本文标题: 『 MySQL篇 』:MySQL表的相关约束

本文链接: https://www.lsjlt.com/news/372145.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 『 MySQL篇 』:MySQL表的相关约束
    基础篇 MySQL系列专栏(持续更新中 …)1『 MySQL篇 』:库操作、数据类型2『 MySQL篇 』:MySQL表的CURD操作3『 MySQL篇 』:MySQL表的相关约束 文章目录 1 . 非空约束 (`not nu...
    99+
    2023-08-16
    mysql 数据库 sql
  • 【MySQL】表的约束
    文章目录 1. 约束概念2. 空属性3. 默认值5. comment——列描述6. zerofill7. 主键8. 复合主键9. 自增长10. 唯一键关于唯一键的理解 11. 外键外键的理...
    99+
    2023-10-25
    mysql 数据库
  • 【mysql】—— 表的约束
    目录 序言 (一)空属性 (二)默认值 (三)列描述 (四)zerofill (五)主键 (六)自增长 (七)唯一键 (八)外键 总结 序言 真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法...
    99+
    2023-08-31
    mysql 数据库
  • 【MySQL系列】表约束的学习
    「前言」文章内容大致是MySQL的表的约束。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、MySQL表的约束1.1 空属性1.2 默认值(default)1.3 列描述(comme...
    99+
    2023-08-16
    mysql 学习 adb
  • MySQL——约束(constraint)
    本篇文章总结一下MySQL中的约束,为什么要使用约束?什么是约束以及约束的分类。数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。它...
    99+
    2023-09-08
    数据库 mysql
  • Mysql表的约束超详细讲解
    目录约束的概念空属性默认值列描述zerofill主键自增长唯一键外键约束的概念 约束:通过限制用户操作的方式,来达到维护数据本身安全,完整性的一套方案。 为什么要有约束? Mysql...
    99+
    2024-04-02
  • 【MySQL】主键约束和外键约束
    目录 1、PRIMARY KEY 2、FOREIGN KEY 3、表的设计 3.1 一对一 3.2 一对多 3.3 多对多 1、PRIMARY KEY 上期我们讲述了 not null 和 unique 约束,而本期的第一个约束就...
    99+
    2023-09-01
    mysql 数据库
  • mysql怎么临时关闭一张表的外健约束
    要临时关闭MySQL中一张表的外键约束,可以使用以下步骤:1. 登录到MySQL数据库服务器。2. 执行以下命令以选择要操作的数据库...
    99+
    2023-08-31
    mysql
  • MySQL:数据类型和表的约束
    1. 数据类型 学习语言的时候首先就是学习数据类型,数据类型起着为变量合理分配空间的作用。数据库同样需要合理使用空间,其次还可以约束SQL语句的正确性,所以同样需要数据类型。 1.0. 数据类型分类 分类数据类型解释数值类型BIT (...
    99+
    2023-08-16
    mysql 数据库
  • MySQL数据库约束,表的设计
    ❤️Author: 老九 ☕️个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏:MySQL通关系列 文章目录 数据库约束no...
    99+
    2023-09-17
    数据库 mysql database
  • MySQL数据库表中的约束详解
    目录mysql表中的约束(constraint)约束分类非空约束唯一性约束复合约束主键约束自增列-AUTO_INCREMENT外键约束FOREIGN KEY约束CHECK约束DEFAULT约束MySQL表中的约束(con...
    99+
    2023-03-02
    MySQL表中的约束 MySQL数据库约束 MySQL约束的使用
  • MySQL学习之数据库表五大约束详解小白篇
    目录1.约束概念和分类2.五大约束的添加和删除2.1添加约束的六种方法2.2三种删除约束的方式2.3五大约束分别对应的添加删除方式(序号对应2.1和2.2)2.4对于创建约束的总结2...
    99+
    2024-04-02
  • 在 MySQL 中显示表命令的约束?
    您可以借助 SHOW 命令显示表上的约束。语法如下 -show create table yourTableName;上述命令将显示表 ENGINE 的所有约束。使用它,你甚至可以看到所有的列名和相应的数据类型。为了理解上面的MySQL语句...
    99+
    2023-10-22
  • 获取MySQL中的外键约束列表
    假设我们有一个包含多个表的数据库“business”。如果您只想显示外键约束,请使用以下查询 -mysql> select * −> from information_schema.referenti...
    99+
    2023-10-22
  • mysql建表外键约束怎么写
    mysql外键约束语法为:alter table child_table add foreign key (foreign_key_column) references parent_t...
    99+
    2024-04-22
    mysql
  • mysql中常见的约束
    mysql 中常见的约束包括:主键约束、外键约束、唯一约束、非空约束、自增约束和检查约束。这些约束有助于确保数据完整性、提高数据质量、维护关系完整性并增强性能。 MySQL 中常见的约...
    99+
    2024-05-01
    mysql 数据丢失
  • MySQL主键约束和外键约束详解
    目录1、PRIMARY KEY2、FOREIGN KEY3、表的设计3.1 一对一3.2 一对多3.3 多对多1、PRIMARY KEY 上期我们讲述了 not null 和 unique 约束,而本期的第一个约束就是这...
    99+
    2023-03-13
    mysql主键约束和外键约束 mysql主键和外键
  • MySQL约束和表的复杂查询操作
    ✨博客主页: 心荣~ ✨系列专栏:【MySQL】 ✨一句短话: 难在坚持,贵在坚持,成在坚持! 文章目录 一. 数据库约束1. 数据库常用约束2. not null 约束3. unique约束...
    99+
    2023-09-14
    mysql 数据库 sql
  • mysql中约束的作用
    小编给大家分享一下mysql中约束的作用,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!什么叫做约束?约束,就是要求数据需要满足什么条件的一种“规定”。主要有如下几种约束:主键约束:形式: pr...
    99+
    2024-04-02
  • MySQL(32)MySQL 检查约束(CHECK)
    MySQL 检查约束(CHECK) MySQL 检查约束(CHECK)是用来检查数据表中字段值有效性的一种手段,可以通过 CREATE TABLE 或 ALTER TABLE 语句实现。设置检查约束时要根据实际情况进行设置,这样能够减少无效...
    99+
    2023-10-27
    mysql 数据库 sql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作