MySQL 8 教程

MySQL - 主页 MySQL - 简介 MySQL - 功能 MySQL - 版本 MySQL - 变量 MySQL - 安装 MySQL - 管理 MySQL - PHP 语法 MySQL - Node.js 语法 MySQL - Java 语法 MySQL - Python 语法 MySQL - 连接 MySQL - Workbench

MySQL 8 数据库

MySQL - 创建数据库 MySQL - 删除数据库 MySQL - 选择数据库 MySQL - 显示数据库 MySQL - 复制数据库 MySQL - 数据库导出 MySQL - 数据库导入 MySQL - 数据库信息

MySQL 8 用户

MySQL - 创建用户 MySQL - 删除用户 MySQL - 显示用户 MySQL - 更改密码 MySQL - 授予权限 MySQL - 显示权限 MySQL - 撤销权限 MySQL - 锁定用户账户 MySQL - 解锁用户账户

MySQL 8 表

MySQL - 创建表 MySQL - 显示表 MySQL - 修改表 MySQL - 重命名表 MySQL - 克隆表 MySQL - 截断表 MySQL - 临时表 MySQL - 修复表 MySQL - 描述表 MySQL - 添加/删除列 MySQL - 显示列 MySQL - 重命名列 MySQL - 表锁定 MySQL - 删除表 MySQL - 派生表

MySQL 8 查询

MySQL - 查询 MySQL - 约束 MySQL - INSERT 插入查询 MySQL - SELECT 查询 MySQL - UPDATE 更新查询 MySQL - DELETE删除查询 MySQL - REPLACE 替换查询 MySQL - 忽略插入 MySQL - 重复键更新时插入 MySQL - 插入到另一个表语句

MySQL 8 视图

MySQL - 创建视图 MySQL - 更新视图 MySQL - 删除视图 MySQL - 重命名视图

MySQL 8 索引

MySQL - 索引 MySQL - 创建索引 MySQL - 删除索引 MySQL - 显示索引 MySQL - 唯一索引 MySQL - 聚集索引 MySQL - 非聚集索引

MySQL 运算符和子句

MySQL - Where 子句 MySQL - Limit 子句 MySQL - Distinct 子句 MySQL - Order By 子句 MySQL - Group By 子句 MySQL - Having 子句 MySQL - AND 运算符 MySQL - OR 或运算符 MySQL - LIKE 运算符 MySQL - IN 运算符 MySQL - ANY 运算符 MySQL - Exists 运算符 MySQL - NOT 运算符 MySQL - NOT EQUAL 运算符 MySQL - IS NULL 运算符 MySQL - IS NOT NULL 运算符 MySQL - Between 运算符 MySQL - UNION 运算符 MySQL - UNION 与 UNION ALL MySQL - MINUS 运算符 MySQL - INTERSECT 运算符 MySQL - INTERVAL 运算符

MySQL 连接

MySQL - 使用连接 MySQL - Inner Join 内连接 MySQL - LEFT JOIN 左连接 MySQL - RIGHT JOIN 右连接 MySQL - CROSS JOIN 交叉连接 MySQL - 全连接 MySQL - 自连接 MySQL - Delete Join 删除连接 MySQL - UPDATE JOIN 更新连接 MySQL - 联合 vs 连接

MySQL 键

MySQL - UNIQUE 唯一键 MySQL - PRIMARY KEY 主键 MySQL - FOREIGN KEY 外键 MySQL - 复合键 MySQL - 备用键

MySQL 触发器

MySQL - 触发器 MySQL - 创建触发器 MySQL - 显示触发器 MySQL - 删除触发器 MySQL - 插入前触发器 MySQL - 插入后触发器 MySQL - 更新前触发器 MySQL - 更新后触发器 MySQL - 删除前触发器 MySQL - 删除后触发器

MySQL 8 数据类型

MySQL - 数据类型 MySQL - VARCHAR MySQL - BOOLEAN MySQL - ENUM 枚举 MySQL - DECIMAL 十进制 MySQL - INT 整数 MySQL - FLOAT 浮点数 MySQL - BIT 位 MySQL - TINYINT 微小整数 MySQL - BLOB 二进制大对象 MySQL - SET 集合

MySQL 正则表达式

MySQL - 正则表达式 MySQL - RLIKE 运算符 MySQL - NOT LIKE 运算符 MySQL - NOT REGEXP 运算符 MySQL - regexp_instr() 函数 MySQL - regexp_like() 函数 MySQL - regexp_replace() 函数 MySQL - regexp_substr() 函数

MySQL 全文搜索

MySQL - 全文搜索 MySQL - 自然语言全文搜索 MySQL - 布尔全文搜索 MySQL - 查询扩展全文搜索 MySQL - ngram 全文解析器

MySQL8 函数和运算符

MySQL - 日期和时间函数 MySQL - 算术运算符 MySQL - 数字函数 MySQL - 字符串函数 MySQL - 聚合函数

MySQL 8 其他概念

MySQL - NULL 值 MySQL - 事务 MySQL - 序列 MySQL - 处理重复项 MySQL - SQL 注入 MySQL - 子查询 MySQL - 注释 MySQL - 检查约束 MySQL - 存储引擎 MySQL - 将表导出为 CSV 文件 MySQL - 将 CSV 文件导入数据库 MySQL - UUID MySQL - 通用表表达式 MySQL - 级联删除 MySQL - Upsert 操作 MySQL - 水平分区 MySQL - 垂直分区 MySQL - 游标 MySQL - 存储函数 MySQL - SIGNAL 异常处理 MySQL - RESIGNAL 异常处理 MySQL - 字符集 MySQL - 排序规则 MySQL - 通配符 MySQL - 别名 MySQL - ROLLUP 超级聚合 MySQL - 当前日期 MySQL - 字面量 MySQL - 存储过程 MySQL - EXPLAIN 语句 MySQL - JSON MySQL - 标准差 MySQL - 查找重复记录 MySQL - 删除重复记录 MySQL - 选择随机记录 MySQL - 显示进程列表 MySQL - 更改列类型 MySQL - 重置自动增量 MySQL - Coalesce() 函数

MySQL 8 实用资源

MySQL - 实用函数 MySQL - 语句参考 MySQL - 快速指南 MySQL - 实用资源 MySQL - 讨论


MySQL − 约束

MySQL 约束

MySQL 约束可用于为表中的列设置某些规则。这些约束可以限制在特定列中可插入或更新的数据类型。这有助于您维护表中数据的准确性和可靠性。

MySQL 约束有两种类型。

  • 列级约束:这类约束仅适用于表中的某一列。
  • 表级约束:这类约束将应用于整个表。

MySQL 中常用的约束包括 NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK、DEFAULT、CREATE INDEX、AUTO_INCREMENT 等。

语法

以下是在表中为列添加约束的基本语法 -

CREATE TABLE table_name (  
   Column_name1 datatype constraint,  
   Column_name2 datatype constraint,  
   Column_name3 datatype constraint,  
   .........  
);  

MySQL NOT NULL 约束

默认情况下,MySQL 表中的列可以包含 NULL 值。在某些情况下,我们可能希望特定列不接受或包含 NULL 值。为此,我们可以使用 MySQL NOT NULL 约束。

此约束强制特定字段始终包含一个值,这意味着如果不向该字段添加值,我们就无法插入或更新记录。

示例

在下面的查询中,我们在 CUSTOMERS 表的 IDNAME 列上添加 NOT NULL 约束。因此,在插入记录时,IDNAME 列将不接受 NULL 值。

CREATE TABLE CUSTOMERS (
   ID int NOT NULL,
   NAME varchar(20) NOT NULL,
   AGE int
);

我们尝试向此表中插入记录。以下语句将向 CUSTOMERS 表中插入一条记录 -

INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(1, 'Nikhil', 18);

但是,如果我们尝试插入 ID 为 NULL 的记录 -

INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(Null, 'Varun', 26);

将生成一条错误,提示"列'ID'不能为空"。

ERROR 1048 (23000): Column 'ID' cannot be null

同样,如果我们尝试将 NULL 作为值传递给 NAME 列,也会产生类似的错误。

INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(3, Null, 19);

这将产生以下错误 -

ERROR 1048 (23000): Column 'NAME' cannot be null

如上查询所示,第一条记录已成功插入,因为它在 ID 和 Name 列中没有空值。然而,第二条和第三条记录未插入,因为我们试图在不该为 NULL 的列中插入 NULL 值。

MySQL UNIQUE 约束

MySQL 中的 UNIQUE 约束确保列中的每个值都必须不同。这意味着具有 UNIQUE 约束的列不能重复相同的值;每个值都必须唯一。

注意:我们可以在单个表上设置一个或多个 UNIQUE 约束。

示例

以下查询在 CUSTOMERS 表的 ID 列上创建 UNIQUE 约束 -

CREATE TABLE CUSTOMERS (
   ID int NOT NULL,
   NAME varchar(20) NOT NULL,
   AGE int,
   UNIQUE (ID)
 );

现在,我们将以下记录插入到上面创建的表中 -

INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(1, 'Nikhil', 18);
INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(1, 'Varun', 26);

在上面的代码块中,第二个插入语句返回错误"Duplicate entry '1' for key 'customers.ID",因为我们插入的 ID 值已存在于表中。因此,它是重复的,查询会生成以下错误 -

ERROR 1062 (23000): Duplicate entry '1' for key 'customers.ID'

MySQL 主键约束

MySQL 中的主键约束用于唯一标识表中的每条记录。这意味着,如果我们在表中的某个列上定义主键,则该列必须包含唯一值,并且不能包含空值。

注意:一个表只能有一个主键。

示例

以下查询在 CUSTOMERS 表的 ID 列上创建主键 -

CREATE TABLE CUSTOMERS (
   ID int NOT NULL,
   NAME varchar(20) NOT NULL,
   AGE int,
   PRIMARY KEY (ID)
);

创建表后,将以下记录插入到上面创建的表中 -

INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES (1, 'Nikhil', 18);
Query OK, 1 row affected (0.01 sec)

由于我们在 ID 列上添加了 PRIMARY KEY 约束,如果您尝试插入具有重复 ID 值或 NULL 值的记录,则会产生错误。

INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES (1, 'Varun', 26);
ERROR 1062 (23000): Duplicate entry '1' for key 'customers.PRIMARY'

INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES (NULL, 'Datta', 19);
ERROR 1048 (23000): Column 'ID' cannot be null

如上查询所示,第一个插入语句已成功插入表中。而第二个和第三个语句返回错误,因为它们在主键列(即 ID)中包含重复值和 NULL 值。

MySQL 外键约束

MySQL 中的外键约束用于将一个表中的字段或字段集合链接到另一个表的主键。

具有外键的表称为子表,具有主键的表称为父表或引用表。

示例

以下查询在创建 ORDERS 表时在 CUST_ID 列上创建外键 -

表:客户

CREATE TABLE CUSTOMERS (
   CUST_ID int NOT NULL,
   NAME varchar(20) NOT NULL,
   AGE int,
   PRIMARY KEY (CUST_ID)
);

表: Orders

CREATE TABLE ORDERS (
   ORDER_ID int NOT NULL,
   ORDER_NUMBER int NOT NULL,
   CUST_ID int,
   FOREIGN KEY (CUST_ID) REFERENCES CUSTOMERS (CUST_ID)
);

MySQL CHECK 约束

MySQL 中的 CHECK 约束限制了可插入列的值的范围。此约束确保插入列的值必须满足指定的条件。

示例

以下查询在 CUSTOMERS 表的 AGE 列上创建 CHECK 约束,以确保学生的年龄必须为 18 岁或以上 -

CREATE TABLE CUSTOMERS (
   ID int NOT NULL,
   NAME varchar(20) NOT NULL,
   AGE int,
   CHECK (AGE >= 18)
 );

创建表后,我们可以将记录插入到上面创建的表中,如下所示 -

INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(1, 'Nikhil', 18);

INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(3, 'Datta', 19);

由于我们在 AGE 列上添加了 CHECK 约束,因此学生的年龄必须大于或等于 18 岁。如果您尝试插入年龄小于 18 岁的记录,则会生成错误。

INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(2, 'Varun', 16);
ERROR 3819 (HY000): Check constraint 'customers_chk_1' is violated.

INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(4, 'Karthik', 15);
ERROR 3819 (HY000): Check constraint 'customers_chk_1' is violated.

示例

以下查询在多个列(AGE 和 ADDRESS)上创建了 CHECK 约束 -

CREATE TABLE CUSTOMERS (
   ID int NOT NULL,
   NAME varchar(20) NOT NULL,
   AGE int,
   ADDRESS varchar(40),
   CONSTRAINT CHECK_AGE CHECK (AGE >= 18 AND ADDRESS = "Mumbai")
);

现在,让我们将以下记录插入到上面创建的表中 -

INSERT INTO CUSTOMERS(ID, NAME, AGE, ADDRESS) VALUES(1, 'Nikhil', 18, 'Mumbai');
Query OK, 1 row affected (0.01 sec)

INSERT INTO CUSTOMERS(ID, NAME, AGE, ADDRESS) VALUES(3, 'Datta', 19, 'Delhi');
ERROR 3819 (HY000): Check constraint 'CHECK_AGE_AND_ADDRESS' is violated.

第二条插入语句返回错误,因为它违反了检查约束的条件,即 (AGE >= 18 AND ADDRESS = "Mumbai")。

MySQL DEFAULT 约束

MySQL 中的 DEFAULT 约束用于为表中的特定列分配默认值。当插入过程中未提供其他值时,此默认值将应用于 DEFAULT 指定列中的任何新记录。

示例

在下面的查询中,我们在 CUSTOMERS 表的 ADDRESS 列上定义 DEFAULT 约束。当未插入任何值时,我们将"Mumbai"指定为默认值。-

CREATE TABLE CUSTOMERS (
   ID int NOT NULL,
   NAME varchar(20) NOT NULL,
   AGE int,
   ADDRESS varchar(40) DEFAULT "Mumbai"
);

这里,我们插入前两条记录,ADDRESS 列中没有任何值。在第三条记录中,我们将 ADDRESS 值插入为"Delhi"。

INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(1, 'Nikhil', 18);

INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(2, 'Varun', 16);

INSERT INTO CUSTOMERS(ID, NAME, AGE, ADDRESS) VALUES(3, 'Datta', 19, 'Delhi');

执行以下查询以显示插入上述表中的记录 -

Select * from CUSTOMERS;

在下面的输出中,我们可以看到前两行的 ADDRESS 列中的值默认为"Mumbai"。

ID NAME AGE ADDRESS
1 Nikhil 18 Mumbai
2 Varun 16 Mumbai
3 Datta 19 Delhi

MySQL CREATE INDEX 约束

MySQL 中的 CREATE INDEX 约束用于为表中的一列创建索引。

索引用于更快地从数据库获取数据。但是,用户无法看到索引的实际作用,它们只是用来加快搜索和查询的速度。

示例

在这里,我们使用以下查询创建一个名为 CUSTOMERS 的表 -

CREATE TABLE CUSTOMERS (
   ID int NOT NULL,
   NAME varchar(20) NOT NULL,
   AGE int,
   ADDRESS varchar(40),
   PRIMARY KEY (ID)
);

以下查询在 CUSTOMERS 表的 ADDRESS 列上创建一个名为"index_address"的索引 -

CREATE INDEX index_address ON CUSTOMERS (ADDRESS);

MySQL AUTO_INCREMENT 约束

当在表的特定列上定义 AUTO_INCREMENT 约束时,当新记录插入该列时,它将自动生成一个唯一的编号。

默认情况下,起始值为 1,并且每插入一条新记录,它都会自动将其值加 1。

示例

以下查询在 CUSTOMERS 表的 ID 列上添加 AUTO_INCREMENT 约束 -

CREATE TABLE CUSTOMERS (
   ID int NOT NULL AUTO_INCREMENT,
   NAME varchar(20) NOT NULL,
   AGE int,
   PRIMARY KEY (ID)
);

在下面的插入语句中,我们不会插入 ID 值。

INSERT INTO STUDENTS(NAME, AGE) VALUES('Nikhil', 18);
INSERT INTO STUDENTS(NAME, AGE) VALUES('Varun', 16);
INSERT INTO STUDENTS(NAME, AGE) VALUES('Datta', 19);

现在,执行以下查询以显示上述创建的表的记录 -

Select * from CUSTOMERS;

正如我们在下面的 STUDENTS 表中看到的,由于 ID 列上的 AUTO_INCREMENT 约束,ID 列中的值会自动递增。

ID NAME AGE
1 Nikhil 18
2 Varun 16
3 Datta 19