SuperAPI AI 工具集

mariadb-syntax-check-constraints

数据与分析

查看项目

更新于 10-15 22:18

技能介绍

用途:指导在 MariaDB 中声明、命名、删除和推理 CHECK 约束,用于执行列或表不变量、校验 JSON 结构、替代触发器式校验,以及从 MySQL 8 迁移 CHECK 约束。CHECK 自 MariaDB 10.2.1 起真正强制执行,早于 MySQL 8。\n\n主要能力与要点:CHECK 谓词为 NULL 时通过(三值逻辑),只有显式 FALSE 才失败,故可空列需配合 NOT NULL 才能同时要求有值且满足谓词;用 CHECK (JSON_VALID(col)) 校验 JSON 列,MariaDB 的 JSON 是 LONGTEXT 别名,10.4.3+ 起 JSON 别名自动加 CHECK,但 LONGTEXT/TEXT 上显式声明更稳妥,且推荐用于所有迁移脚本。优先用 CHECK 而非触发器处理纯不变量,CHECK 基于集合、声明式、更快,并可在 information_schema.CHECK_CONSTRAINTS 中查看。\n\n用法:列级 CHECK 内联在列定义中,自动生成名为 CONSTRAINT_1 等,若需后续 DROP 应显式命名;表级 CHECK 用 CONSTRAINT 名可跨同行的多列。用 ALTER TABLE ... ADD CONSTRAINT ... CHECK (...) 添加,ALTER 会校验已有行,失败则 ALTER 失败。DROP 用 ALTER TABLE ... DROP CONSTRAINT。可查 information_schema.CHECK_CONSTRAINTS 找自动生成名。批量导入旧数据可 SET SESSION check_constraint_checks = OFF,但重新开启不会重新校验已有行。\n\n限制:CHECK 不能引用子查询或其他表列,不能使用非确定性函数(NOW()、RAND()、UUID()、CURRENT_TIMESTAMP 等),不允许 auto_increment 列,不允许变量;跨表或工作流校验应改用 BEFORE INSERT/UPDATE 触发器或应用层。INSERT IGNORE 会把 CHECK 违规变成警告而非错误。MySQL 8 的 NOT ENFORCED 在 MariaDB 中被解析但按 ENFORCED 处理。