【MySQL】一文带你了解数据库约束
【转】【MySQL】一文带你了解数据库约束【侵删】
1. 约束类型
作用:
数据库约束是用于限制数据输入或数据更新的规则。数据库约束确保在表中只能插入符合规则的数据,以确保数据的完整性和一致性。
常见的数据库约束包括:
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 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:外键约束
概念:
外键约束是一种用于保持表之间数据一致性的约束,它建立了两个表之间的一对多关系。外键约束确保了一个表中的数据必须和另一个表中的数据相关联,否则就会触发约束错误。
外键约束也可以在创建表时定义或者在已有表上添加。
举例:
外键约束也可以在创建表时定义或者在已有表上添加。
下图定义了一个外键约束:
![]()
外键约束通常用于将两个表之间建立一对多关系,上面图中,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: 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列被定义为非空约束:
这个时候如果插入空的元素就会报错。
上面用到的代码:
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列被定义为唯一约束:
上述例子中,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'1234567891011121314151617181920
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: 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文本采用标准的创建方式,可以使用大多数的比较操作符进行比较操作,例如:=, <, <=, >, >=, <>, != 和 <=>。
- 【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.
- 【MySQL】mysql面试题
- 1. 什么是数据库事务?数据库事务是一个作为单个逻辑工作单元执行的一系列操作。事务具有ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这意味着事务内的操作要么全部成功,要么全部失败,保持数据完整性,并且独立于其他事务运行。2. MySQL中InnoDB与MyISAM的区别是什么?InnoDB支持事务处理,行级锁定和外键,适用于需要高并发和事务处理的场景。MyISAM不支持事务和行级锁定,但读取速度快,适
- 【MySql】mysql 将数据库中的所有表结构和数据 导入到另一个库(亲测有效)
- 一、问题描述在本地开发一个功能,需要结合具体数据测试代码是否正确,但服务器上的数据不可随便修改。此时则需要将服务器上某个数据库的表批量导入到本地、而后进行测试。将数据库db1中的所有表及数据(如table1、table2),批量导入到另一个数据库db2中。二、解决方案刚开始自己一直尝试用DataGrip、Navicat的sql/csv格式导入导出,总有错误或者遗漏,比如报错中止、50张表却只导入32张等,可能是操作方式有误或者数据格式有问题。也试过用sql语句,但仍失败。经查阅资料、尝试多次,终
- 【MSQL】MATCH() AGAINST()全文搜索
- 这个问题是关于MySQL的全文搜索查询。MATCH() AGAINST() 是MySQL全文搜索的一部分。问题中的代码是在查询中使用MATCH() AGAINST(),但是使用方式有一些问题。首先,MATCH() 函数的参数应该是一个字段名,而不是一个字段值。其次,AGAINST 子句后面应该是要搜索的字符串,并且这个字符串需要被单引号包围。在布尔全文搜索模式下,你需要使用一些特殊的操作符来表示搜索的重要性或条件。例如,+表示一个词必须存在,而 - 表示一个词必须不存在。SELECT
- 【MySQL】 复合查询 | 内外连接
- 文章目录1. 复合查询unionunion all单行子查询多行子查询多列子查询in关键字all关键字any关键字多表笛卡尔积自连接在where子句使用子查询在from子句中使用子查询合并查询2. 内连接3. 外连接左外连接右外连接1. 复合查询多表笛卡尔积显示雇员名、雇员工资以及所在部门的名字由于员工 信息属于 emp表 而所在部门名字属于 dept表 数据来自不同的表,所以需要进行多表查询表示从 emp (员工表) 和dept (部门表)
- 【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