MySQL8.0添加和删除check约束

本文详细介绍了在MySQL8.0中如何使用check约束,包括添加、删除和修改check约束的方法,以及如何验证check约束的有效性。

MySQL8.0中,添加了对check约束的操作,我使用的MySQL版本是8.0.17.0,下面我使用navicat for MySQL来演示。

check约束作用效果

使用show create table来查看创建表的语句

| testtable | CREATE TABLE `testtable` (
 	 `ID` varchar(5) NOT NULL,
	  `name` varchar(20) NOT NULL,
	  `dept_name` varchar(20) DEFAULT NULL,
	  `salary` decimal(8,2) DEFAULT NULL,
	  PRIMARY KEY (`ID`),
	  KEY `dept_name` (`dept_name`),
	  CONSTRAINT `testtable_ibfk_1` FOREIGN KEY (`dept_name`) REFERENCES `department` (`dept_name`) ON DELETE SET NULL,
	  CONSTRAINT `testtable_chk_1` CHECK ((`salary` > 29000))
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

这里对属性salary添加check约束,规定salary>29000
检查check约束是否起作用

mysql> INSERT INTO testtable
    -> (ID,name,dept_name,salary)
    -> VALUES
    -> ('00000','name','Biology','10000');
3819 - Check constraint 'testtable_chk_1' is violated.

发现check约束是能起作用的

添加check约束

ALTER TABLE `表名` ADD CONSTRAINT [约束名] CHECK(约束条件) [[NOT] ENFORCED];

[ ]表示可填可不填,不填约束名的话,MySQL会自动生成约束名
ENFORCED表示是否强制,默认是强制的,即会对改变的数据进行约束,NOT ENFORCED表示check约束不作用。

mysql> ALTER TABLE `testtable` ADD CONSTRAINT testtable_chk_1 CHECK(salary>29000);
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0

删除check约束

ALTER TABLE `表名` DROP CHECK 约束名;
mysql> ALTER TABLE `testtable` DROP CHECK testtable_chk_1;
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0

修改check约束的强制性

ALTER TABLE `表名` ALTER CHECK 约束名 [NOT] ENFORCED;
mysql> ALTER TABLE `testtable` ALTER CHECK testtable_chk_1 NOT ENFORCED;
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0

目前所知MySQL对check约束的操作就这三句。

<think>首先,用户的问题是:“我想在MySQL 8.0中创建表时如何添加外键 请问MySQL 8.0 创建表时添加外键的方法”。我需要根据系统级指令来回答。 系统级指令包括: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题,保证真实可靠。 用户的问题是关于MySQL 8.0中创建表时添加外键的方法。参考提供的引用: - 引用[1]:提到了外键约束的错误3780,原因是主表从表的列数据类型不兼容,比如无符号约束不匹配。 - 引用[2]:描述了如何创建表,包括外键约束。 - 引用[3]:提到了创建表的顺序,因为外键约束需要先创建主表。 - 引用[4]:讨论了外键创建错误1005,可能原因是约束名重复。 我需要整合这些信息,提供一个清晰的步骤指南。 回答结构: 1. **引言**:简要解释外键的作用重要性。 2. **步骤**:逐步说明如何在创建表时添加外键。 3. **注意事项**:基于引用,强调数据类型兼容性、约束名唯一性等。 4. **示例**:提供一个简单的SQL示例。 5. **相关问题**:生成相关问题。 生成相关问题: - 基于主题,如错误处理、优化等。 确保使用中文回答。 最终回答格式: - 使用Markdown,结构清晰。 - 在引用信息时,添加引用标识如[^1]。 - 结尾添加相关问题部分。 现在,构建内容: 1. **引言**:外键用于维护表间的引用完整性。在MySQL 8.0中,添加外键需要在创建表时指定。 2. **步骤**: - 确保存储引擎是InnoDB(因为MyISAM不支持外键)。 - 主表(被引用的表)必须先创建。 - 在创建从表时,使用FOREIGN KEY约束。 - 语法:在CREATE TABLE语句中,添加CONSTRAINT约束名 FOREIGN KEY (列名) REFERENCES 主表名(主键列)。 3. **注意事项**: - 数据类型必须兼容:整数类型的大小符号必须相同;字符串类型字符集排序规则必须相同(引用[1])。 - 约束名必须在数据库中唯一(引用[4])。 - 外键列必须索引;如果未索引,MySQL会自动创建索引。 4. **示例**:基于引用[2][3],创建一个简单的例子。 - 例如,创建orders表invoices表,其中invoices表有外键关联到orders。 5. **错误处理**:简要提及常见错误如3780(数据类型不兼容)1005(约束名重复或表问题)。 相关问题: 1. 如何解决MySQL外键约束错误3780? 2. 外键约束MySQL中有什么限制? 3. 如何修改现有表以添加外键? 确保回答真实可靠:基于MySQL文档提供的引用。</think>### MySQL 8.0 创建表时添加外键的方法 在 MySQL 8.0 中,外键用于维护表间的引用完整性,确保数据一致性。添加外键需在创建表时指定,并遵循特定规则。以下是详细步骤注意事项,基于 MySQL 官方文档实际案例[^1][^2][^3]。 #### 步骤 1: 确保前提条件 - **存储引擎**:主表从表必须使用 InnoDB 引擎(MySQL 默认引擎),因为 MyISAM 不支持外键。 - **主表先创建**:被引用的表(主表)必须先于从表创建。例如,如果外键关联到 `orders` 表的 `id` 列,则需先创建 `orders` 表[^3]。 - **数据类型兼容**:外键列主键列的数据类型必须完全兼容: - 整数类型:大小符号(如 UNSIGNED)必须相同。 - 字符串类型:字符集排序规则必须相同,长度可不同[^1]。 #### 步骤 2: 创建表时添加外键语法 在 `CREATE TABLE` 语句中,使用 `FOREIGN KEY` 子句定义外键约束: ```sql CREATE TABLE 从表名 ( 列1 数据类型, 列2 数据类型, ... CONSTRAINT 约束名 FOREIGN KEY (外键列名) REFERENCES 主表名(主键列名) [ON DELETE 操作] [ON UPDATE 操作] -- 可选:定义级联操作 ) ENGINE=InnoDB; ``` - **约束名**:必须唯一,避免重复(否则报错 1005)[^4]。 - **级联操作**:可选参数,如 `ON DELETE CASCADE`(主表删除时从表自动删除关联行)或 `ON UPDATE SET NULL`(主表更新时从表列设为 NULL)。 #### 步骤 3: 完整示例 假设创建两个表:`orders`(主表) `invoices`(从表),其中 `invoices` 的 `order_id` 列外键关联到 `orders.id`。 1. **先创建主表 `orders`**: ```sql CREATE TABLE orders ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, -- 主键,需带 UNSIGNED name VARCHAR(100) NOT NULL, price FLOAT, quantity INT, category VARCHAR(50) ) ENGINE=InnoDB; ``` 2. **再创建从表 `invoices`**: ```sql CREATE TABLE invoices ( number INT AUTO_INCREMENT PRIMARY KEY, order_id INT UNSIGNED, -- 数据类型与 orders.id 完全一致(包括 UNSIGNED) in_date DATE, total_amount FLOAT CHECK (total_amount > 0), CONSTRAINT fk_order -- 约束名唯一 FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE -- 可选级联删除 ) ENGINE=InnoDB; ``` - **关键点**:`order_id` 的数据类型(`INT UNSIGNED`)必须与 `orders.id` 完全匹配,否则报错 3780[^1]。 #### 注意事项 1. **数据类型兼容**:常见错误 3780 因数据类型不匹配(如主键有 UNSIGNED 而外键无)。检查符号、字符集等[^1]。 2. **约束名唯一**:约束名(如 `fk_order`)必须在数据库内唯一,否则报错 1005(errno: 121)[^4]。 3. **索引要求**:外键列会自动创建索引,无需手动添加。 4. **验证创建**:使用 `SHOW CREATE TABLE invoices;` 检查外键是否生效。 5. **错误处理**: - 报错 3780:检查数据类型兼容性。 - 报错 1005:确认约束名唯一或表名无冲突[^4]。 #### 示例场景 基于引用[2][^3],创建产品库时顺序应为: 1. 创建无外键的表(如 `employees`)。 2. 创建主表(如 `orders`)。 3. 最后创建带外键的从表(如 `invoices`)。 通过以上步骤,您可高效添加外键,确保数据完整性。💅
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值