MariaDB中如何删除自动生成名称的列CHECK约束?
在MariaDB中删除未命名列CHECK约束的方法
问题背景
创建表时未显式指定CHECK约束名称,通过information_schema.check_constraints查询到的约束名为quantity,但执行ALTER TABLE test DROP CONSTRAINT quantity时提示约束不存在,该操作在MySQL中可正常执行,但MariaDB 10.7.8中无效。
解决步骤
1. 获取约束的真实名称
MariaDB中,未命名的列级CHECK约束会自动生成类似表名_chk_序号的真实名称,但information_schema.check_constraints返回的CONSTRAINT_NAME可能显示为列名,而非实际约束名。可以通过以下两种方式获取真实名称:
- 方式一:查看表的创建语句
执行SQL:
SHOW CREATE TABLE `test`;
输出示例:
CREATE TABLE `test` ( `quantity` int(11) NOT NULL, CONSTRAINT `test_chk_1` CHECK (`quantity` > 0) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
这里的test_chk_1就是约束的真实名称。
- 方式二:查询系统表联合获取
执行SQL:
SELECT tc.CONSTRAINT_NAME FROM information_schema.table_constraints tc JOIN information_schema.check_constraints cc ON tc.CONSTRAINT_NAME = cc.CONSTRAINT_NAME WHERE tc.TABLE_NAME = 'test' AND tc.CONSTRAINT_TYPE = 'CHECK';
该查询会返回约束的真实名称。
2. 删除约束
拿到真实约束名称后,执行删除语句:
ALTER TABLE `test` DROP CONSTRAINT `test_chk_1`;
替换test_chk_1为你查询到的真实名称即可成功删除约束。
原因说明
MariaDB与MySQL的自动命名规则存在差异:
- MySQL中未命名的列级CHECK约束会直接使用列名作为约束名(或类似格式),因此查询到的名称可直接用于删除。
- MariaDB中未命名的列级CHECK约束会生成
表名_chk_序号格式的真实名称,但information_schema.check_constraints的CONSTRAINT_NAME字段会显示列名,导致查询结果与实际约束名不符,从而无法通过该名称删除约束。
内容的提问来源于stack exchange,提问作者user2078872
相关产品推荐
相关产品推荐

