代码之家  ›  专栏  ›  技术社区  ›  Manngo

向表中添加命名的检查约束

  •  1
  • Manngo  · 技术社区  · 3 年前

    我正在尝试添加一个名为 CHECK MariaDB中表的约束。据我所知,从文档和散布在各处的一些示例来看,以下语法应该有效:

    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;
    

    事实并非如此。我得到了一个非常有用的信息:

    您的SQL语法有错误;查看与MariaDB服务器版本相对应的手册,以了解在“check”附近使用的正确语法(电子邮件如“%@%”) )字符集utf8mb4 COLLATE utf8mb 4_unicode_520_…'在第4行

    当然告诉我什么都没有。

    知道吗

    • 如果我删除 constraint customer_email 它有效
    • 如果我在后面加一个逗号 email VARCHAR(60) ,使检查约束成为一个单独的命令,它也可以工作

    这是否意味着MariaDB不支持上述语法,或者我遗漏了什么?

    我有一把小提琴 https://dbfiddle.uk/PYJKnmuU 。

    1 回复  |  直到 3 年前
        1
  •  1
  •   Bill Karwin    3 年前

    根据 https://mariadb.com/kb/en/constraint/#check-constraints ,似乎只有将约束定义为表级约束时才能使用命名约束。

    换句话说,这应该起作用:

    ...
    email VARCHAR(60),    -- notice the comma
    constraint customer_email check (email like '%@%')
    ...
    

    但是没有像您所做的那样将命名检查约束与相应的列内联定义。

    逗号在这种情况下是很重要的。在逗号后添加换行符是可选的,因为SQL通常在几乎所有情况下都将空白视为可选。

    语法允许对列使用内联CHECK约束,但如果需要命名约束,则不允许。