【问题标题】:Cannot add constraint check with function call in Mariadb无法在 Mariadb 中使用函数调用添加约束检查
【发布时间】:2019-11-23 17:42:37
【问题描述】:

我在Ubuntu 18.04上使用Mariadb 10.4.10,工具客户端是DBeaver 6.2.5

我想充分利用 Mariadb 中的约束检查功能来确保数据完整性,因为它是从 10.2.1 开始强制执行的。

但是,每当我尝试将新约束添加到现有表中时,都会出现错误。

我尝试的查询是这样的:

ALTER TABLE mydb.users ADD CONSTRAINT `username_minlen`
  CHECK (CHAR_LENGTH(username) >= 6);

而且错误信息是这样的:

SQL 错误 [4025] [23000]: (conn=47) CONSTRAINT username_minlen 失败 mydb.users

我的猜测是 CHAR_LENGTH 是问题的原因,因为当我运行这样的查询时:

ALTER TABLE mydb.users ADD CONSTRAINT `username_no_empty_str`
  CHECK (username <> '');

这工作得很好。

我想知道我是否根本无法调用 CHECK 表达式中的任何函数或过程,但谷歌搜索显示没有令人满意的答案,其中大多数与 Mariadb 以外的其他 SQL 系统有关。

在 Mariadb 中调用函数在语法上是不可能的吗?

【问题讨论】:

    标签: mariadb constraints


    【解决方案1】:

    您应该首先检查您是否有违反它的数据:

    SELECT *
    FROM `mydb`.`users`
    WHERE CHAR_LENGTH(username) < 6;
    

    然后更新它:

    UPDATE `mydb`.`users`
    SET username = ?
    WHERE CHAR_LENGTH(username) < 6;
    

    最后应用检查约束:

    ALTER TABLE mydb.users ADD CONSTRAINT `username_minlen` CHECK (CHAR_LENGTH(username) >= 6);
    

    【讨论】:

    • 哇,我从来没有意识到即使是现有记录也会影响即将添加的新约束...非常感谢您的回答。
    • @Bluboks 我很高兴听到这个消息。 How does accepting an answer work?
    猜你喜欢
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    相关资源
    最近更新 更多