开发者社区> 问答> 正文

Mysql check not enforce语法无法正常识别

环境:mysql 8.0.22 , druid 1.2.3

SQL :

建表语句:

CREATE TABLE t12 ( CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c12_positive CHECK (c2 > 0), c3 INT CHECK (c3 < 100), CONSTRAINT c21_nonzero CHECK (c1 <> 0), CHECK (c1 > c3) );

alter table t12 ALTER CHECK c12_positive NOT ENFORCED;

通过MYSQL的show CREATE table t1 得到的建表语句

CREATE TABLE t12 ( c1 int DEFAULT NULL, c2 int DEFAULT NULL, c3 int DEFAULT NULL, CONSTRAINT c12_positive CHECK ((c2 > 0)) /*!80016 NOT ENFORCED */, CONSTRAINT c21_nonzero CHECK ((c1 <> 0)), CONSTRAINT t12_chk_1 CHECK ((c1 <> c2)), CONSTRAINT t12_chk_2 CHECK ((c1 > 10)), CONSTRAINT t12_chk_3 CHECK ((c3 < 100)), CONSTRAINT t12_chk_4 CHECK ((c1 > c3)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

其中测试代码如下:

public static void main(String[] args) { String sql ="CREATE TABLE t12 (\n" + " c1 int DEFAULT NULL,\n" + " c2 int DEFAULT NULL,\n" + " c3 int DEFAULT NULL,\n" + " CONSTRAINT c12_positive CHECK ((c2 > 0)) /*!80016 NOT ENFORCED */,\n" + " CONSTRAINT c21_nonzero CHECK ((c1 <> 0)),\n" + " CONSTRAINT t12_chk_1 CHECK ((c1 <> c2)),\n" + " CONSTRAINT t12_chk_2 CHECK ((c1 > 10)),\n" + " CONSTRAINT t12_chk_3 CHECK ((c3 < 100)),\n" + " CONSTRAINT t12_chk_4 CHECK ((c1 > c3))\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci"; MySqlStatementParser parser = new MySqlStatementParser(sql); SQLStatement createTableStatement = parser.parseStatement(); System.out.println(createTableStatement); }

解释报错:

Exception in thread "main" com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'((c2 > 0)) /*!80016 NOT ENFORCED */, CO', expect ), actual null, pos 167, line 5, column 49, token HINT at com.alibaba.druid.sql.parser.SQLParser.printError(SQLParser.java:558) at com.alibaba.druid.sql.parser.SQLParser.accept(SQLParser.java:566) at com.alibaba.druid.sql.dialect.mysql.parser.MySqlCreateTableParser.parseCreateTable(MySqlCreateTableParser.java:362) at com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser.parseCreate(MySqlStatementParser.java:301) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:249) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatement(SQLStatementParser.java:4465)

原提问者GitHub用户WillsonYip

展开
收起
山海行 2023-07-05 18:10:51 99 0
3 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    看起来是在使用 MySQL 的 CHECK 约束时出现了问题,具体表现为 "not enforce" 语法无法被识别。

    需要说明的是,MySQL 的 CHECK 约束在较早的版本中并没有得到完全支持,因此可能会存在一些限制和不兼容性。同时,"not enforce" 这个语法并不是 MySQL 支持的 CHECK 约束语法,可能是其他数据库或者工具支持的语法。

    如果您希望在 MySQL 中使用 CHECK 约束,可以考虑以下两种方式:

    使用触发器实现。MySQL 支持使用触发器(Trigger)实现数据约束,可以在插入或更新数据时进行检查和限制。您可以创建一个 BEFORE INSERT 或 BEFORE UPDATE 触发器,在其中编写检查条件,并在条件不满足时抛出异常或者回滚事务。

    使用存储过程实现。MySQL 支持使用存储过程(Stored Procedure)实现数据处理和约束,可以在存储过程中编写复杂的业务逻辑和数据约束。您可以创建一个存储过程,在其中编写检查条件,并在条件不满足时抛出异常或者回滚事务。

    2023-07-30 20:00:35
    赞同 展开评论 打赏
  • 这个问题可能是因为MySQL 8.0.22版本不支持MySQL 8.0.16版本中的“NOT ENFORCED”选项。在MySQL 8.0.16版本中,该选项用于指示在创建表时不需要验证某些约束,但是在MySQL 8.0.22版本中,该选项被移除了。
    为了解决这个问题,您可以考虑使用MySQL 8.0.16版本或者更早的版本来运行Druid。如果您无法使用更早的版本,您可以考虑使用MySQL 8.0.22版本中的其他约束来验证表的数据。

    2023-07-09 10:24:52
    赞同 展开评论 打赏
  • 问题已修复,请用新版本

    https://github.com/alibaba/druid/releases/tag/1.2.5

    原回答者GitHub用户wenshao

    2023-07-06 10:47:59
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
One Box: 解读事务与分析一体化数据库 HybridDB for MySQL 立即下载
One Box:解读事务与分析一体化数据库HybridDB for MySQL 立即下载
如何支撑HTAP场景-HybridDB for MySQL系统架构和技术演进 立即下载

相关镜像