You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:44:58