前言简述
上一篇,我们一起学习了 MySQL 内置的一些常用函数,想必各位看友都有一定的收获吧,在此基础上,我们来继续学习 MySQL 中字段约束的相关知识,大家可能从字面意义上来看就是限制,没错就是限制,那下面我们来详细讲解一下。
MySQL 约束
基础概念
概念:约束(Constraint)是作用于表中字段上的规则,用于限制存储在表中的数据。
目的:保证数据库中插入数据的正确性,有效性和完整性。
分类:在 MySQL 数据库中约束分为非空约束、默认约束、唯一约束、主键约束、外键约束、以及 检查约束(8.0.16 版本后加入)。
|
|
|
|
|---|---|---|
NOT NULL |
|
|
DEFAULT |
|
|
UNIQUE |
|
|
PRIMARY |
|
|
FOREIGN |
|
|
CHECK |
|
|
特别注意:不同的数据库管理系统可能某些约束关键字是不一样的,不过基础的非空约束(Not Null Constraint)、唯一约束(Unique Constraint)、默认约束(Default Constraint)基本上都满足,若大家使用时报错可参考官方文档。
使用约束
牛刀小试:通过一个案例需求,完成 constraint_user 的创建,演示配置字段约束对于保证数据的有效性、完整性。
|
|
|
|
|
|
|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在部署的 MySQL 8.X 数据库中执行以下建表语句:
USE TEST;-- 建表语句CREATE TABLE IF NOT EXISTS constraint_user (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT '用户主键ID',name VARCHAR(16) NOT NULL COMMENT '用户名称',age TINYINT UNSIGNED CHECK( age > 0 && age <= 120 ) COMMENT '年龄',sex ENUM('F','M') COMMENT '性别',phone_number CHAR(11) NOT NULL CHECK ( phone_number REGEXP '^1[3-9]\\d{9}$') COMMENT '手机号',id_card CHAR(18) NOT NULL UNIQUE KEY CHECK (id_card REGEXP '^\\d{17}[0-9Xx]$') COMMENT '身份证号' ,status char(1) DEFAULT 'E' COMMENT '状态');
查看建表语句,执行以下 SQL 查询语句:
-- 查看表结构mysql> DESC constraint_user;-- 查看建表语句信息mysql> SHOW CREATE TABLE constraint_user;CREATE TABLE `constraint_user` (`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '用户主键ID',`name` varchar(16) NOT NULL COMMENT '用户名称',`age` tinyint unsigned DEFAULT NULL COMMENT '年龄',`sex` enum('F','M') DEFAULT NULL COMMENT '性别',`phone_number` char(11) NOT NULL COMMENT '手机号',`id_card` char(18) NOT NULL COMMENT '身份证号',`status` char(1) DEFAULT 'E' COMMENT '状态',PRIMARY KEY (`id`),UNIQUE KEY `id_card` (`id_card`),CONSTRAINT `constraint_user_chk_1` CHECK (((`age` > 0) and (`age` <= 120))),CONSTRAINT `constraint_user_chk_2` CHECK (regexp_like(`phone_number`,_utf8mb4'^1[3-9]\\d{9}$')),CONSTRAINT `constraint_user_chk_3` CHECK (regexp_like(`id_card`,_utf8mb4'^\\d{17}[0-9Xx]$'))) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

由上面这个小案例可知,约束之间是可以多个一起使用,使用时注意以空格进行分割,例如:NOT NULL UNIQUE,其次通过查询建表语句看到设置约束都自动格式化到了建表语句的最后,便于我们查看。
特别注意:在 MySQL 8.0.16 版本之后,CHECK 约束是支持的,但是 CHECK 约束的表达式中不能使用函数,例如:CHECK(YEAR(birthday) > 1900) 这种写法是不允许的。
作者:WeiyiGeek
扫码领红包
微信赞赏
支付宝扫码领红包
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。侵权投诉:375170667@qq.com




