返回顶部
首页 > 资讯 > 数据库 >MySQL中常见的约束类型是什么
  • 314
分享到

MySQL中常见的约束类型是什么

2024-04-02 19:04:59 314人浏览 泡泡鱼
摘要

这篇文章给大家分享的是有关Mysql中常见的约束类型是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 约束的字面意思就是规定或者限制某个事该如何去

这篇文章给大家分享的是有关Mysql中常见的约束类型是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

约束的字面意思就是规定或者限制某个事该如何去做,在mysql中,约束就是对数据表中数据指定规则,也就是对数据进行限制,以此来确保可靠性,比如不允许某列出现Null值,实际中我们会遇到以下类型的约束。

  • NOT NULL : 确保列不能有NULL值

  • CHECK : 确保列中的值满足特定条件

  • UNIQUE : 确保一列中的所有值都不同

  • PRIMARY KEYNOT NULLUNIQUE组合,唯一标识表中的每一行

  • FOREIGN KEY : 外键约束

  • DEFAULT : 如果未指定值,则为列设置默认值

约束

1.NULL

Mysql中通过使用NOT NULL确保列中不会出现Null值,创建表时候格式如下:

mysql> create table user(name varchar(255)not null);
Query OK, 0 rows affected (0.06 sec)

如果试图插入一个null值,则会抛出异常。

mysql> insert user values(null);
ERROR 1048 (23000): Column 'name' cannot be null

或者在现有表上新增NOT NULL约束。

mysql> alter table user modify name varchar(255) not null;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

删除NOT NULL约束。

mysql> alter table user modify name varchar(255)  null;
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0

2.CHECK

如果想在列上定义条件约束,可以使用CHECK,比如下面,强制让年龄字段大于18,小于80,否则将会报错。

mysql> create table user(age int(11) check(age>18 and age <80));
Query OK, 0 rows affected, 1 warning (0.06 sec)

插入测试,可以发现9、81在插入的时候抛出异常。

mysql> insert user values(9);
ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated.

mysql> insert user values(19);
Query OK, 1 row affected (0.01 sec)

mysql> insert user values(81);
ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated.
mysql>

也可以进行多列约束,如年龄必须大于18,城市必须为中国。

mysql> create table user(age int(11),city varchar(255) ,check(age>18 and city='中国'));
Query OK, 0 rows affected, 1 warning (0.05 sec)

插入测试。

mysql> insert user values(81,'2');
ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated.
mysql> insert user values(8,'2');
ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated.
mysql> insert user values(20,'2');
ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated.
mysql> insert user values(20,'中国');
Query OK, 1 row affected (0.01 sec)

mysql> insert user values(20,'中国1');
ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated.
mysql> insert user values(85,'中国');
Query OK, 1 row affected (0.01 sec)

mysql> insert user values(9,'中国');
ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated.

还可以让列值必须在指定集合中,如性别必须在男、女、未知、人妖集合中。

mysql> create table user(sex varchar(255) check (sex in ('男','女','未知','人妖')));
Query OK, 0 rows affected (0.05 sec)

插入测试。

mysql> insert user values("男");
Query OK, 1 row affected (0.02 sec)

mysql> insert user values("男男");
ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated.
mysql> insert user values("女");
Query OK, 1 row affected (0.01 sec)

mysql> insert user values("人妖");
Query OK, 1 row affected (0.00 sec)

为约束命名并删除约束。

mysql> create table user (age int(11) ,constraint CHK_AGE check(age>18));
Query OK, 0 rows affected, 1 warning (0.05 sec)

mysql> insert user values(5);
ERROR 3819 (HY000): Check constraint 'CHK_AGE' is violated.

mysql> alter table user drop check CHK_AGE;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> insert user values(5);
Query OK, 1 row affected (0.01 sec)

但是,这样的写法你见过吗?

猜猜下面的作用是什么。

这其实是一个case when条件判断,让其仅仅可以插入>=18,或者是在0-10之间的数。

CREATE TABLE `user` (`age` int(11) CHECK 
(((case when (`age` >=18) then 1 
else 
(case when age<10 and age >0 then 1 else 2 end) end) =1)));

3.UNIQUE

UNIQUE约束确保列中的没有重复的值,UNIQUEPRIMARY KEY约束都为一列值的唯一性提供保障,但是UNIQUE每个表可以出现多次,而PRIMARY KEY只能出现一个。

如下面name字段不能重复。

mysql> create table user (name varchar(255),unique(name));
Query OK, 0 rows affected (0.07 sec)

插入测试。

mysql> insert user values("张三");
Query OK, 1 row affected (0.02 sec)

mysql> insert user values("张三");
ERROR 1062 (23000): Duplicate entry '张三' for key 'user.name'mysql>

对此约束进行起名,并删除。

mysql> create table user (name varchar(255),constraint name_un unique(name));
Query OK, 0 rows affected (0.07 sec)

mysql> insert user values("张三");
Query OK, 1 row affected (0.02 sec)

mysql> insert user values("张三");
ERROR 1062 (23000): Duplicate entry '张三' for key 'user.name_un'
mysql> alter table user drop index name_un;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> insert user values("张三");
Query OK, 1 row affected (0.02 sec)

插入后可以用以下语句查看创建语句。

mysql> show create table user;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                 |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| user  | CREATE TABLE `user` (
  `name` varchar(255) DEFAULT NULL,
  UNIQUE KEY `name_un` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

要删除UNIQUE约束,可以使用DROP INDEXALTER TABLE语句:

mysql> DROP INDEX name_un ON user;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table user;
+-------+-----------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                |
+-------+-----------------------------------------------------------------------------------------------------------------------------+
| user  | CREATE TABLE `user` (
  `name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+-----------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

在现有表上添加。

mysql> alter table user add constraint name_un unique(name);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

4.PRIMARY KEY

通常每个表中包含一个用于唯一标识每一行的值,这个列就被称为PRIMARY KEY。

mysql> create table user (id int(11) ,age int(11),primary key (id));
Query OK, 0 rows affected, 2 warnings (0.06 sec)

mysql> insert user values(1,2);
Query OK, 1 row affected (0.02 sec)

mysql> insert user values(1,2);
ERROR 1062 (23000): Duplicate entry '1' for key 'user.PRIMARY'mysql>

5.FOREIGN KEY

FOREIGN KEY用于约束表中的一个字段必须是另一个表中某个字段所存在的值,但是在另一个表中,这个列不一定是主键,但必须是唯一性索引,否则会创建失败。

比如orders表中的userId必须参考user表中的id,如果插入的userId在user表中不存在,则无法插入。

mysql> create table orders (id int(11) primary key ,userId int(11) ,  FOREIGN KEY (userId) REFERENCES user(id) );
Query OK, 0 rows affected, 2 warnings (0.06 sec)

mysql> insert orders values(1,3);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`t`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`userId`) REFERENCES `user` (`id`))

mysql> insert orders values(1,1);
Query OK, 1 row affected (0.01 sec)

但是存在一个问题,如果主表(user)中记录被删除或者更新,那orders中的记录该怎么办?,如下面的例子,可以发现直接报错了。

mysql> update user set id =2 where id =1;

Cannot delete or update a parent row: a foreign key constraint fails (`t`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`userId`) REFERENCES `user` (`id`)

MySQL提供了几个约束可以帮助我们解决这类问题,比如在user表更新时,orders也相继更新。

  1. RESTRICT:如果子表中有记录,则拒绝更新或删除父表中的记录。

  2. CASCADE:更新或删除父表中的记录时,自动更新或删除子表中的记录。

  3. SET NULL:在更新或删除父表记录时,将子表中字段的值设置为空。

可以发现,默认采用的是RESTRICT,下面来修改一下,让在更新时候也同样更新,在删除时候设置null。

mysql> alter table orders add constraint orders_ibfk_1  FOREIGN KEY (`userId`) REFERENCES `user` (`id`) on update cascade on
delete set null;
Query OK, 0 rows affected (0.12 sec)
Records: 0  Duplicates: 0  Warnings: 0

测试更新

mysql> select * from user;
+----+--------+
| id | name   |
+----+--------+
|  1 | 张三   |
+----+--------+
1 row in set (0.00 sec)

mysql> select * from orders;
Empty set (0.00 sec)

mysql> insert orders values (1,1);
Query OK, 1 row affected (0.01 sec)

mysql> update user set id =2 where id =1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from orders;
+----+--------+
| id | userId |
+----+--------+
|  1 |      2 |
+----+--------+
1 row in set (0.01 sec)

测试删除。

mysql> delete from user where id =2;
Query OK, 1 row affected (0.02 sec)

mysql> select * from orders;
+----+--------+
| id | userId |
+----+--------+
|  1 |   NULL |
+----+--------+
1 row in set (0.00 sec)

6.DEFAULT

DEFAULT约束用于为列设置默认值,如果没有为某个字段赋值,系统就会自动为这个字段插入默认值,没有赋值指的是在insert插入数据时没有指明这个字段,如果指定null值,最终存放的还是null值。

mysql> create table user(age int(11) default 18);
Query OK, 0 rows affected, 1 warning (0.05 sec)

mysql> insert user values();
Query OK, 1 row affected (0.02 sec)

mysql> select * from user;
+------+
| age  |
+------+
|   18 |
+------+
1 row in set (0.00 sec)

感谢各位的阅读!关于“MySQL中常见的约束类型是什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中常见的约束类型是什么

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

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

猜你喜欢
  • MySQL中常见的约束类型是什么
    这篇文章给大家分享的是有关MySQL中常见的约束类型是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 约束的字面意思就是规定或者限制某个事该如何去...
    99+
    2024-04-02
  • mysql中常见的约束是什么
    这篇文章主要为大家展示了“mysql中常见的约束是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql中常见的约束是什么”这篇文章吧。常见约束NOT NULL:非空,该字段的值必填UNI...
    99+
    2023-06-20
  • MySQL中常见的六个约束类型详解
    目录前言1. not null2. unique3. default4. primary key自增主键auto_increment5. foreign key6. check总结前...
    99+
    2024-04-02
  • mysql中常见的几种约束是什么
    小编给大家分享一下mysql中常见的几种约束是什么,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!mysql中常见的几种约束有:1、主键;2、默认值;3、唯一;4、外键;5、非空。约束是一种限制...
    99+
    2024-04-02
  • mysql中常见的约束
    mysql 中常见的约束包括:主键约束、外键约束、唯一约束、非空约束、自增约束和检查约束。这些约束有助于确保数据完整性、提高数据质量、维护关系完整性并增强性能。 MySQL 中常见的约...
    99+
    2024-05-01
    mysql 数据丢失
  • mysql常见约束有什么
    小编给大家分享一下mysql常见约束有什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、非空约束(not null)非空约束...
    99+
    2024-04-02
  • sql中常见的5种约束是什么
    这篇文章将为大家详细讲解有关sql中常见的5种约束是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。sql完整性约束有:非空约束,唯一约束,主键约束,外键约束,条件约束...
    99+
    2024-04-02
  • MySQL中常见的约束有哪些
    这篇“MySQL中常见的约束有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL中常见的约束有哪些”文章吧。1、非...
    99+
    2023-06-27
  • mysql中常见约束 - 自律即自由
    1 #常见约束 2 3 53 54 CREATE TABLE 表名( 55 字段名 字段类型 列级约束, 56 字段名 字段类型, 57 表级约束 58 59 ) 60...
    99+
    2022-03-19
    mysql中常见约束 - 自律即自由
  • PHP方法参数类型约束是什么
    这篇文章主要介绍了PHP方法参数类型约束是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。关于PHP的方法参数类型约束在之前的文章PHP方法参数的那点事儿中,我们讲过关于P...
    99+
    2023-06-15
  • oracle中常见的约束有哪些
    oracle中的常见约束通过特定规则维护数据完整性和一致性。这些约束包括:1. 主键约束:确保每行都有唯一id。2. 外键约束:将表中的列与另一个表中的列关联。3. 唯一约束:保证列值唯...
    99+
    2024-05-09
    oracle
  • MySQL约束类型的示例分析
    这篇文章主要介绍MySQL约束类型的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!约束 约束保证数据的完整性和一致性约束分为表级约束和列级约束约束类型包括:NOT ...
    99+
    2024-04-02
  • MySQL:数据类型和表的约束
    1. 数据类型 学习语言的时候首先就是学习数据类型,数据类型起着为变量合理分配空间的作用。数据库同样需要合理使用空间,其次还可以约束SQL语句的正确性,所以同样需要数据类型。 1.0. 数据类型分类 分类数据类型解释数值类型BIT (...
    99+
    2023-08-16
    mysql 数据库
  • mysql约束条件是什么
    MySQL约束条件是用于限制表中数据的规则。它们可以确保数据的完整性和一致性。常见的约束条件包括:1. 主键约束:保证表中每一行都有...
    99+
    2023-08-31
    mysql
  • MySQL六种约束是什么
    本文小编为大家详细介绍“MySQL六种约束是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL六种约束是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是约束作用于表上的规则,限制存储在表中的数...
    99+
    2023-07-05
  • C#泛型的一般约束是什么
    本篇内容主要讲解“C#泛型的一般约束是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#泛型的一般约束是什么”吧!C# 泛型约束中的一般约束使用 C# 泛型,编译器会将一般代码编译为 IL,...
    99+
    2023-06-17
  • 常见的DDOS攻击类型是什么
    常见的DDoS攻击类型包括: ICMP Flood: 攻击者通过发送大量的ICMP(Internet Control Messa...
    99+
    2024-05-15
    DDoS攻击
  • MySQL外键约束的作用是什么
    MySQL外键约束的作用是确保在相关表之间的数据完整性和一致性。外键约束定义了一个表中的列或一组列,这些列的值必须匹配另一个表中的主...
    99+
    2023-08-30
    MySQL
  • 常见的MySQL锁类型
    MySQL 中常见的锁类型,需要具体代码示例导言:在数据库中,当多个客户端同时对同一数据进行读取或修改时,会出现并发操作的问题。为了保证数据的一致性和完整性,数据库引擎采用了锁机制来控制对共享数据的访问。MySQL 作为一种常用的关系型数据...
    99+
    2023-12-21
    - 行锁 - 读锁 (共享锁) - 写锁 (排他锁)
  • 代理ip中常见的协议类型是什么
    这篇文章给大家分享的是有关代理ip中常见的协议类型是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、Http代理:最常用的代理,代理客户机的http访问,主要代理浏览器访问网页,其端口一般为80,8080,...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作