环境: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
看起来是在使用 MySQL 的 CHECK 约束时出现了问题,具体表现为 "not enforce" 语法无法被识别。
需要说明的是,MySQL 的 CHECK 约束在较早的版本中并没有得到完全支持,因此可能会存在一些限制和不兼容性。同时,"not enforce" 这个语法并不是 MySQL 支持的 CHECK 约束语法,可能是其他数据库或者工具支持的语法。
如果您希望在 MySQL 中使用 CHECK 约束,可以考虑以下两种方式:
使用触发器实现。MySQL 支持使用触发器(Trigger)实现数据约束,可以在插入或更新数据时进行检查和限制。您可以创建一个 BEFORE INSERT 或 BEFORE UPDATE 触发器,在其中编写检查条件,并在条件不满足时抛出异常或者回滚事务。
使用存储过程实现。MySQL 支持使用存储过程(Stored Procedure)实现数据处理和约束,可以在存储过程中编写复杂的业务逻辑和数据约束。您可以创建一个存储过程,在其中编写检查条件,并在条件不满足时抛出异常或者回滚事务。
这个问题可能是因为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版本中的其他约束来验证表的数据。
问题已修复,请用新版本
https://github.com/alibaba/druid/releases/tag/1.2.5
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。