MariaDB添加命名CHECK约束语法报错,是否不支持该写法?
问题
尝试在MariaDB中为表添加一个命名CHECK约束,根据文档及零散示例编写了如下SQL语句:
DROP TABLE IF EXISTS customers; CREATE TABLE customers ( id int AUTO_INCREMENT PRIMARY KEY, name varchar(255), email VARCHAR(60) constraint customer_email check (email like '%@%') ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci ENGINE=INNODB;
执行时报错,错误提示:
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'check (email like '%@%')
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_...' at line 4
测试后发现:
- 移除
constraint customer_email后语句可正常执行 - 在
email VARCHAR(60)后添加逗号,将CHECK约束作为单独定义时也可正常执行
请问这是否意味着MariaDB不支持上述语法,还是我有遗漏的地方?
回答
MariaDB确实不支持在列定义后直接跟命名CHECK约束的语法,这是它与部分其他数据库的语法差异点。
当你在列定义后直接写check(...)时,MariaDB会将其识别为列级匿名CHECK约束,这种写法是支持的;但如果要给CHECK约束命名,必须将其作为表级约束单独定义,也就是你测试的第二种写法,示例如下:
DROP TABLE IF EXISTS customers; CREATE TABLE customers ( id int AUTO_INCREMENT PRIMARY KEY, name varchar(255), email VARCHAR(60), CONSTRAINT customer_email CHECK (email LIKE '%@%') ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci ENGINE=INNODB;
总结规则:
- 列级约束仅支持匿名CHECK,不能添加
CONSTRAINT 约束名前缀 - 命名CHECK约束必须作为表级约束,单独一行定义,与列定义用逗号分隔
内容的提问来源于stack exchange,提问作者Manngo
相关产品推荐
相关产品推荐

