- MySQL 基础
- MySQL - 首页
- MySQL - 简介
- MySQL - 特性
- MySQL - 版本
- MySQL - 变量
- MySQL - 安装
- MySQL - 管理
- MySQL - PHP 语法
- MySQL - Node.js 语法
- MySQL - Java 语法
- MySQL - Python 语法
- MySQL - 连接
- MySQL - Workbench
- MySQL 数据库
- MySQL - 创建数据库
- MySQL - 删除数据库
- MySQL - 选择数据库
- MySQL - 显示数据库
- MySQL - 复制数据库
- MySQL - 数据库导出
- MySQL - 数据库导入
- MySQL - 数据库信息
- MySQL 用户
- MySQL - 创建用户
- MySQL - 删除用户
- MySQL - 显示用户
- MySQL - 修改密码
- MySQL - 授予权限
- MySQL - 显示权限
- MySQL - 收回权限
- MySQL - 锁定用户账户
- MySQL - 解锁用户账户
- MySQL 表
- MySQL - 创建表
- MySQL - 显示表
- MySQL - 修改表
- MySQL - 重命名表
- MySQL - 克隆表
- MySQL - 截断表
- MySQL - 临时表
- MySQL - 修复表
- MySQL - 描述表
- MySQL - 添加/删除列
- MySQL - 显示列
- MySQL - 重命名列
- MySQL - 表锁定
- MySQL - 删除表
- MySQL - 派生表
- MySQL 查询
- MySQL - 查询
- MySQL - 约束
- MySQL - 插入查询
- 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 - 不等于运算符
- MySQL - IS NULL 运算符
- MySQL - IS NOT NULL 运算符
- MySQL - Between 运算符
- MySQL - UNION 运算符
- MySQL - UNION 与 UNION ALL
- MySQL - MINUS 运算符
- MySQL - INTERSECT 运算符
- MySQL - INTERVAL 运算符
- MySQL 连接
- MySQL - 使用连接
- MySQL - 内连接
- MySQL - 左连接
- MySQL - 右连接
- MySQL - 交叉连接
- MySQL - 全连接
- MySQL - 自连接
- MySQL - 删除连接
- MySQL - 更新连接
- MySQL - Union 与 Join
- MySQL 触发器
- MySQL - 触发器
- MySQL - 创建触发器
- MySQL - 显示触发器
- MySQL - 删除触发器
- MySQL - 插入前触发器
- MySQL - 插入后触发器
- MySQL - 更新前触发器
- MySQL - 更新后触发器
- MySQL - 删除前触发器
- MySQL - 删除后触发器
- MySQL 数据类型
- 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 - 聚合函数
- MySQL 其他概念
- MySQL - NULL 值
- MySQL - 事务
- MySQL - 使用序列
- MySQL - 处理重复项
- MySQL - SQL 注入
- MySQL - 子查询
- MySQL - 注释
- MySQL - 检查约束
- MySQL - 存储引擎
- MySQL - 将表导出到 CSV 文件
- MySQL - 将 CSV 文件导入数据库
- MySQL - UUID
- MySQL - 公共表表达式
- MySQL - On Delete Cascade
- MySQL - Upsert
- MySQL - 水平分区
- MySQL - 垂直分区
- MySQL - 游标
- MySQL - 存储函数
- MySQL - 信号
- MySQL - 重新发送信号
- MySQL - 字符集
- MySQL - 校对
- MySQL - 通配符
- MySQL - 别名
- MySQL - ROLLUP
- MySQL - 当天日期
- MySQL - 字面量
- MySQL - 存储过程
- MySQL - Explain
- MySQL - JSON
- MySQL - 标准差
- MySQL - 查找重复记录
- MySQL - 删除重复记录
- MySQL - 选择随机记录
- MySQL - 显示 Processlist
- MySQL - 更改列类型
- MySQL - 重置自动递增
- MySQL - Coalesce() 函数
- MySQL 有用资源
- 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表的ID和NAME列添加 NOT NULL 约束。因此,在记录插入时,ID和NAME列将不接受 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);
将生成错误“Column 'ID' cannot be null”。
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 的列中插入 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 PRIMARY KEY 约束
MySQL 中的 PRIMARY KEY 约束用于唯一标识表中的每条记录。这意味着,如果我们在表中的特定列上定义主键,则它必须包含唯一值,并且不能包含 NULL 值。
注意:一个表只能有一个主键。
示例
以下查询在 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 FOREIGN KEY 约束
MySQL 中的 FOREIGN KEY 约束用于将一个表中的一列或多列链接到另一个表的主键。
具有外键的表称为子表,具有主键的表称为父表或被引用表。
示例
以下查询在创建 ORDERS 表时在 CUST_ID 列上创建外键:
表:Customers
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 |