一篇文章带你了解MySQL数据库约束

 更新时间:2023年06月12日 10:11:22   作者:是小辰  
数据库中要管理很多数据,但是这些数据是否正确、是否非法,光靠人力来检验是远远不够的,因此我们想让数据库拥有丰富的检验和校验能力,所以便引入了约束,下面这篇文章主要给大家介绍了关于MySQL数据库约束的相关资料,需要的朋友可以参考下

1. 约束类型

作用:

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

常见的数据库约束包括:

  1. 主键约束:用于唯一标识表中的每一行数据,确保数据唯一性和完整性。
  2. 外键约束:用于确保表之间数据的关系正确性,保证引用表中的数据必须存在于被引用的表中。
  3. 非空约束:用于确保列中的值不为空。
  4. 唯一约束:用于确保列中的值不重复。
  5. 默认约束:用于设置默认值,当插入数据时如果未提供该值,则数据库将使用默认值。
  6. 检查约束:用于确保列中的值符合特定的条件或表达式。
  7. 触发器约束:用于在特定情况下自动执行操作,如插入或删除数据时执行某项操作。

2.PRIMARY KEY:主键约束

概念:

主键约束是一种用于限制表中唯一标识每行记录的数据库约束。主键约束可以确保表中每行的唯一性,并且可以作为其他表与该表之间关系的依据。每个表只能有一个主键约束,主键约束的值必须是唯一的且不为空。

主键约束可以在创建表时定义,也可以在已有表上添加。

举例:

1.在创建一个名为"student"的表时,可以给"id"列定义主键约束。

主键约束

这个时候,当我们添加元素的时候,id的值就必须唯一并且不为空。

主键举例

>2.当表已经创建好,表中并没有任何一列进行主键约束,我们还可以通过下面这种方式进行主键约束。

约束

注意

这种约束方式并不如前者,而且当想要约束的列,有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 1
mysql> insert into student values(null,'张三');
ERROR 1048 (23000): Column 'id' cannot be null
mysql> 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)

3.FOREIGN KEY:外键约束

概念:

外键约束是一种用于保持表之间数据一致性的约束,它建立了两个表之间的一对多关系。外键约束确保了一个表中的数据必须和另一个表中的数据相关联,否则就会触发约束错误。

外键约束也可以在创建表时定义或者在已有表上添加。

举例:

外键约束也可以在创建表时定义或者在已有表上添加。

下图定义了一个外键约束:

外键

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

约束

上面用到的代码:

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: 0

mysql> 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`))

4.NOT NULL:非空约束

概念:

非空约束是一种用于确保列中的值不为空的约束。如果为某个列定义了非空约束,那么在插入或更新数据时必须为该列提供一个非空值,否则就会触发非空约束错误。

举例:

在创建表时,可以为某个列定义非空约束。

下面的代码定义了一个名为student的表,其中的id列被定义为非空约束:

非空约束

这个时候如果插入空的元素就会报错。

非空报错

上面用到的代码:

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 null
mysql> insert into student values('李四');

5.UNIQUE:唯一约束

概念:

唯一约束是一种用于确保某个列中的值唯一的约束。如果为某个列定义了唯一约束,那么该列中的值必须是唯一的,不允许有重复值。唯一约束可以用于确保表中某一列或多列的组合中没有重复值。

举例:

在创建表时,可以为某个列定义唯一约束。

下面的代码定义了一个名为users的表,其中的email列被定义为唯一约束:

唯一

上述例子中,student表中的id列被定义为唯一约束,因此,任何向student表插入数据的操作,都必须确保id列中的值是唯一的。

唯一报错

上面用到的代码:

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'

5.DEFAULT:默认值约束

概念:

默认值约束是指在向表中插入新行时,如果没有为某个列指定具体的值,则该列会使用预定义的默认值。默认值可以是任何常量或表达式,例如字符串、数字、日期等。如果某个列定义了默认值约束,则在执行INSERT操作时,如果没有为该列指定具体值,则会自动使用默认值。

举例:

在创建表时,可以为某个列指定默认值约束。例如,下面的代码创建了一个名为student的表,其中的name列被定义为默认值约束:

默认

当插入null.

默认值

上面用到的代码:

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: 0

mysql> 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)

6.总结

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

到此这篇关于一篇文章带你了解MySQL数据库约束的文章就介绍到这了,更多相关MySQL数据库约束内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL中的聚簇索引、非聚簇索引、联合索引和唯一索引详细介绍

    MySQL中的聚簇索引、非聚簇索引、联合索引和唯一索引详细介绍

    本文主要介绍了MySQL的索引类型,根据索引的存储方式来划分,索引可以分为聚簇索引和非聚簇索引。聚簇索引的特点是叶子节点包含了完整的记录行,而非聚簇索引的叶子节点只有所以字段和主键ID,感兴趣的同学可以阅读本文
    2023-04-04
  • MySQL报错1067 :Invalid default value for ‘字段名’

    MySQL报错1067 :Invalid default value for&n

    在使用MySQL5.7时,还原数据库的时候报错,下面就来介绍一下MySQL报错1067 :Invalid default value for ‘字段名’,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • MySQL主要使用的几种索引算法小结

    MySQL主要使用的几种索引算法小结

    本文主要介绍了MySQL主要使用的几种索引算法小结,包括B+Tree索引、Hash索引、Full-Text索引、R-Tree索引和Bitmap索引,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • mysql多次调用存储过程的问题

    mysql多次调用存储过程的问题

    这个问题也困扰了我很长时间,准确的说正是因为他的存储过程无法在同一连接中2次或者多次执行,我大幅修该了程序架构,全部题换成了sql,但是毕竟sql无法执行有相当逻辑的代码,最总让我从新测试以求寻找解决之道。
    2011-05-05
  • 详解 MySQL中count函数的正确使用方法

    详解 MySQL中count函数的正确使用方法

    这篇文章主要介绍了 MySQL中count函数的正确使用方法,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下。
    2020-11-11
  • MySQL ODBC驱动安装过程与应用技巧

    MySQL ODBC驱动安装过程与应用技巧

    本教程详细介绍了MySQL ODBC驱动在Windows环境下的安装过程、配置方法以及在不同场景下的应用,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • mysql查询如何去掉多余零

    mysql查询如何去掉多余零

    这篇文章主要介绍了mysql查询如何去掉多余零问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 这种sql写法真的会导致索引失效吗

    这种sql写法真的会导致索引失效吗

    这篇文章主要给大家介绍了关于网上流传的某种sql写法会导致索引失效的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用sql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • windows环境中mysql忘记root密码的解决方法详解

    windows环境中mysql忘记root密码的解决方法详解

    本篇文章是对windows环境中mysql忘记root密码的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • MySQL远程访问设置终极方法

    MySQL远程访问设置终极方法

    这篇文章主要介绍了MySQL远程访问设置终极方法,本文总结了多种设置方法和技巧,是解决远程访问的终极解决方案,需要的朋友可以参考下
    2014-12-12

最新评论