您的当前位置:首页>全部文章>文章详情

【MySQL】一文带你了解数据库约束

CrazyPanda发表于:2023-11-30 21:47:14浏览:696次TAG:

【转】【MySQL】一文带你了解数据库约束【侵删】


1. 约束类型

作用:
数据库约束是用于限制数据输入或数据更新的规则。数据库约束确保在表中只能插入符合规则的数据,以确保数据的完整性和一致性。
常见的数据库约束包括:

  1. 主键约束:用于唯一标识表中的每一行数据,确保数据唯一性和完整性。

  2. 外键约束:用于确保表之间数据的关系正确性,保证引用表中的数据必须存在于被引用的表中。

  3. 非空约束:用于确保列中的值不为空。

  4. 唯一约束:用于确保列中的值不重复。

  5. 默认约束:用于设置默认值,当插入数据时如果未提供该值,则数据库将使用默认值。

  6. 检查约束:用于确保列中的值符合特定的条件或表达式。

  7. 触发器约束:用于在特定情况下自动执行操作,如插入或删除数据时执行某项操作。

2.PRIMARY KEY:主键约束

概念:
主键约束是一种用于限制表中唯一标识每行记录的数据库约束。主键约束可以确保表中每行的唯一性,并且可以作为其他表与该表之间关系的依据。每个表只能有一个主键约束,主键约束的值必须是唯一的且不为空。
主键约束可以在创建表时定义,也可以在已有表上添加。
举例:
1.在创建一个名为"student"的表时,可以给"id"列定义主键约束。
1.png 这个时候,当我们添加元素的时候,id的值就必须唯一并且不为空。
1.png 

>2.当表已经创建好,表中并没有任何一列进行主键约束,我们还可以通过下面这种方式进行主键约束。
1.png 注意
这种约束方式并不如前者,而且当想要约束的列,有null或者有重复元素的时候,会主键约束失败。

上面用到的代码:

mysql> create table student(id int primary key, name varchar(10));Query OK, 0 rows affected (0.02 sec)mysql> desc student;+-------+-------------+------+-----+---------+-------+| Field | Type        | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id    | int(11)     | NO   | PRI | NULL    |       || name  | varchar(10) | YES  |     | NULL    |       |+-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)mysql> insert into values(null,'张三');ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'values(null,'张三')' at line 1mysql> insert into student values(null,'张三');ERROR 1048 (23000): Column 'id' cannot be nullmysql> insert into student values('张三');ERROR 1136 (21S01): Column count doesn't match value count at row 1
mysql> insert into student values(1,'张三');
Query OK, 1 row affected (0.01 sec)

mysql> insert into student values(1,'李四');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql> insert into student values(2,'李四');Query OK, 1 row affected (0.01 sec)mysql> select * from student;+----+------+| id | name |+----+------+|  1 | 张三 ||  2 | 李四 |+----+------+2 rows in set (0.00 sec)12345678910111213141516171819202122232425262728293031323334

3.FOREIGN KEY:外键约束

概念:
外键约束是一种用于保持表之间数据一致性的约束,它建立了两个表之间的一对多关系。外键约束确保了一个表中的数据必须和另一个表中的数据相关联,否则就会触发约束错误。
外键约束也可以在创建表时定义或者在已有表上添加。
举例:
外键约束也可以在创建表时定义或者在已有表上添加。
下图定义了一个外键约束:
1.png 

外键约束通常用于将两个表之间建立一对多关系,上面图中,student表中的class_id列是一个外键,它关联到了class表中的id列。这个外键约束确保student表中的class_id列的值只能从class表中的id列中的值中选择,如果没有,则报错。
1.png

上面用到的代码:

mysql> create table class(id int primary key, name varchar(10));Query OK, 0 rows affected (0.01 sec)mysql> create table student(id int primary key, name varchar(20), class_id int,    -> foreign key (class_id) references class(id));Query OK, 0 rows affected (0.02 sec)mysql> desc student;+----------+-------------+------+-----+---------+-------+| Field    | Type        | Null | Key | Default | Extra |+----------+-------------+------+-----+---------+-------+| id       | int(11)     | NO   | PRI | NULL    |       || name     | varchar(20) | YES  |     | NULL    |       || class_id | int(11)     | YES  | MUL | NULL    |       |+----------+-------------+------+-----+---------+-------+3 rows in set (0.00 sec)mysql> insert into class values(1, '软件工程'),(2, '计科');Query OK, 2 rows affected (0.01 sec)Records: 2  Duplicates: 0  Warnings: 0mysql> insert into student values(20211,'张三',1);Query OK, 1 row affected (0.01 sec)mysql> insert into student values(20212,'李四',2);Query OK, 1 row affected (0.01 sec)mysql> insert into student values(20213,'王五',3);ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`xiaoc`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))1234567891011121314151617181920212223242526272829

4.NOT NULL:非空约束

概念:
非空约束是一种用于确保列中的值不为空的约束。如果为某个列定义了非空约束,那么在插入或更新数据时必须为该列提供一个非空值,否则就会触发非空约束错误。
举例:
在创建表时,可以为某个列定义非空约束。
下面的代码定义了一个名为student的表,其中的id列被定义为非空约束:
非空约束
这个时候如果插入空的元素就会报错。
1.png

上面用到的代码:

mysql> create table student(id int not null, name varchar(10));Query OK, 0 rows affected (0.01 sec)mysql> desc student;+-------+-------------+------+-----+---------+-------+| Field | Type        | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id    | int(11)     | NO   |     | NULL    |       || name  | varchar(10) | YES  |     | NULL    |       |+-------+-------------+------+-----+---------+-------+2 rows in set (0.01 sec)mysql> insert into student values(1,'张三');Query OK, 1 row affected (0.01 sec)mysql> insert into student values(null,'李四');ERROR 1048 (23000): Column 'id' cannot be nullmysql> insert into student values('李四');123456789101112131415161718

5.UNIQUE:唯一约束

概念:
唯一约束是一种用于确保某个列中的值唯一的约束。如果为某个列定义了唯一约束,那么该列中的值必须是唯一的,不允许有重复值。唯一约束可以用于确保表中某一列或多列的组合中没有重复值。
举例:
在创建表时,可以为某个列定义唯一约束。
下面的代码定义了一个名为users的表,其中的email列被定义为唯一约束:
1.png 上述例子中,student表中的id列被定义为唯一约束,因此,任何向student表插入数据的操作,都必须确保id列中的值是唯一的。
1.png

上面用到的代码:

mysql> create table student(id int unique,name varchar(20));Query OK, 0 rows affected (0.02 sec)mysql> desc student;+-------+-------------+------+-----+---------+-------+| Field | Type        | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id    | int(11)     | YES  | UNI | NULL    |       || name  | varchar(20) | YES  |     | NULL    |       |+-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)mysql> insert into student values(1,'张三');Query OK, 1 row affected (0.01 sec)mysql> insert into student values(2,'李四');Query OK, 1 row affected (0.01 sec)mysql> insert into student values(2,'威威');ERROR 1062 (23000): Duplicate entry '2' for key 'id'1234567891011121314151617181920

5.DEFAULT:默认值约束

概念:
默认值约束是指在向表中插入新行时,如果没有为某个列指定具体的值,则该列会使用预定义的默认值。默认值可以是任何常量或表达式,例如字符串、数字、日期等。如果某个列定义了默认值约束,则在执行INSERT操作时,如果没有为该列指定具体值,则会自动使用默认值。
举例:
在创建表时,可以为某个列指定默认值约束。例如,下面的代码创建了一个名为student的表,其中的name列被定义为默认值约束:
1.png 当插入null.
1.png

上面用到的代码:

mysql> create table student(id int, name varchar(10) default '陌路人');Query OK, 0 rows affected (0.02 sec)mysql> desc student;+-------+-------------+------+-----+---------+-------+| Field | Type        | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id    | int(11)     | YES  |     | NULL    |       || name  | varchar(10) | YES  |     | 陌路人  |       |+-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)mysql> insert into student(id) values(1),(2);Query OK, 2 rows affected (0.01 sec)Records: 2  Duplicates: 0  Warnings: 0mysql> insert into student values(3,'张三');Query OK, 1 row affected (0.01 sec)mysql> select * from student;+------+--------+| id   | name   |+------+--------+|    1 | 陌路人 ||    2 | 陌路人 ||    3 | 张三   |+------+--------+3 rows in set (0.00 sec)12345678910111213141516171819202122232425262728

6.总结

数据库约束是数据库设计中的重要概念,它可以有效地保障数据的完整性、一致性、准确性和安全性,帮助开发人员更好地管理和维护数据,所以掌握约束还是非常重要的。
以上就是常用的约束,下次见!

猜你喜欢

【MySQL】MySQL中的json操作
引言Mysql5.7版本以后提供了一个原生的Json类型,Json值将不再以字符串的形式存储,而是采用一种允许快速读取文本元素(document elements)的内部二进制(internal binary)格式。 在Json列插入或者更新的时候将会自动验证Json文本,未通过验证的文本将产生一个错误信息。 Json文本采用标准的创建方式,可以使用大多数的比较操作符进行比较操作,例如:=, <, <=, >, >=, <>, != 和 <=>。
发表于:2024-07-26 浏览:246 TAG:
【MySql】mysql数据库表分区设计实现
文章目录前言一、什么是mysql表分区?二、表分区有哪几种方案? 如何实现1、创建订单表2、添加订单的索引为联合索引(需要修改为索引联合索引,不然后面会报错)3、按照订单时间范围来分区4、向数据库插入数据(创建存储过程,循环插入2023到2025年的数据,数据时间间隔为半个小时1次)5、查询分区数据插入情况6、根据分区查询数据2.1 范围分区(Range Partitioning)2.2 列表分区 (List Partitioning)2.3 哈希分区 (hash Partinioning)2.
发表于:2024-07-16 浏览:375 TAG:
【MySQL】mysql面试题
1. 什么是数据库事务?数据库事务是一个作为单个逻辑工作单元执行的一系列操作。事务具有ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这意味着事务内的操作要么全部成功,要么全部失败,保持数据完整性,并且独立于其他事务运行。2. MySQL中InnoDB与MyISAM的区别是什么?InnoDB支持事务处理,行级锁定和外键,适用于需要高并发和事务处理的场景。MyISAM不支持事务和行级锁定,但读取速度快,适
发表于:2024-06-17 浏览:243 TAG:
【MySql】mysql 将数据库中的所有表结构和数据 导入到另一个库(亲测有效)
一、问题描述在本地开发一个功能,需要结合具体数据测试代码是否正确,但服务器上的数据不可随便修改。此时则需要将服务器上某个数据库的表批量导入到本地、而后进行测试。将数据库db1中的所有表及数据(如table1、table2),批量导入到另一个数据库db2中。二、解决方案刚开始自己一直尝试用DataGrip、Navicat的sql/csv格式导入导出,总有错误或者遗漏,比如报错中止、50张表却只导入32张等,可能是操作方式有误或者数据格式有问题。也试过用sql语句,但仍失败。经查阅资料、尝试多次,终
发表于:2024-01-30 浏览:371 TAG:
【MSQL】MATCH() AGAINST()全文搜索
这个问题是关于MySQL的全文搜索查询。MATCH() AGAINST() 是MySQL全文搜索的一部分。问题中的代码是在查询中使用MATCH() AGAINST(),但是使用方式有一些问题。首先,MATCH() 函数的参数应该是一个字段名,而不是一个字段值。其次,AGAINST 子句后面应该是要搜索的字符串,并且这个字符串需要被单引号包围。在布尔全文搜索模式下,你需要使用一些特殊的操作符来表示搜索的重要性或条件。例如,+表示一个词必须存在,而 - 表示一个词必须不存在。SELECT 
发表于:2024-07-26 浏览:235 TAG:
【MySQL】 复合查询 | 内外连接
文章目录1. 复合查询unionunion all单行子查询多行子查询多列子查询in关键字all关键字any关键字多表笛卡尔积自连接在where子句使用子查询在from子句中使用子查询合并查询2. 内连接3. 外连接左外连接右外连接1. 复合查询多表笛卡尔积显示雇员名、雇员工资以及所在部门的名字由于员工 信息属于 emp表 而所在部门名字属于 dept表 数据来自不同的表,所以需要进行多表查询表示从 emp (员工表) 和dept (部门表)
发表于:2023-11-30 浏览:857 TAG:
【MySQL】mysql百万级数据表翻页查询特别慢的优化方式
最近遇到了mysql百万级数据表翻页查询特别慢的问题,查询第一页的时候,特别快,翻页跨度特别大的时候,翻页查询就会特别慢
发表于:2024-11-14 浏览:251 TAG: #mysql
【MySQL】MySQL数据库CPU飙升到100%解决方案
1、定位cpu问题所在当cpu飙升到100%时,先用操作系统命令top命令观察是不是mysqld占用导致的,如果不是,找出占用高的进程,并进行相关处理。2、查看慢查询日志进入mysql命令行mysql -h主机地址 -u用户名 -p用户密码1查看慢查询SQL是否启用:ON是开启,OFF是关闭。 show variables like ‘log_slow_queries’;开启慢查询日志 set global log_slow_queries = on;3、使用sho
发表于:2024-07-17 浏览:247 TAG:
【MySql】MySQL备份与恢复全面指南
MySQL是目前最流行的关系型数据库管理系统之一,在企业级应用中被广泛使用。无论是开发者还是数据管理员,都需要了解MySQL备份与恢复的基本知识。备份和恢复不仅能够帮助企业保护数据,还能够使系统在不良情况下快速应对,尽可能使其恢复到正常运行状态。本文将详细介绍MySQL备份与恢复的操作步骤,并提供一些最佳实践,以帮助读者在保护其MySQL数据库方面走得更远。一、MySQL备份MySQL备份应该频繁地进行,以确保数据库永远处于最新状态。备份可以分为两种类型:物理备份和逻辑备份。1.物理备份物理备份
发表于:2024-01-24 浏览:292 TAG:
【MySql】select * 查询慢的原因和优化方法
‌使用SELECT *查询语句会导致查询效率低下的原因主要包括‌:它会查询所有的列和行数据,包括不需要的和重复的列,因此会占用更多的系统资源,导致查询效率低下。此外,由于...
发表于:2024-10-21 浏览:271 TAG: #mysql