Java JDBC连接MariaDB执行建表语句提示SQL语法错误排查
问题根因
报错来自两处SQL语法不规范:
Order是SQL保留关键字(对应ORDER BY排序语法),直接作为表名使用时,会被SQL解析器识别为语法关键字而非自定义表名,第一时间触发解析错误。你在PhpMyAdmin中执行同语句成功,是因为客户端会自动给标识符加转义,JDBC执行原始拼接的SQL时不会做这类自动兼容处理。- 主键定义处错误使用单引号包裹字段名
OrderId:SQL中单引号仅用于包裹字符串字面量,不能用来标记表名、字段名这类标识符,这也是不符合语法规范的写法。
修复方法
两种处理方式都可以解决问题:
- (推荐)直接避开保留字命名,把表名改成非关键字,比如
Orders、CustomerOrder,从根源消除冲突,后续写增删改查语句也不需要额外给表名加转义,降低后续出错概率。 - 如果必须用
Order作为表名,就用MariaDB/MySQL规定的标识符转义符反引号`包裹所有自定义的表名、字段名,同时把主键处包裹字段名的单引号替换成反引号。
修正后的建表SQL代码如下:
String sqlCreate = "CREATE TABLE IF NOT EXISTS `Order` (" + " `OrderId` INT(64) NOT NULL AUTO_INCREMENT, " + " `address` VARCHAR(20), " + " `dt` DATE, " + " `status` VARCHAR(20), " + " PRIMARY KEY(`OrderId`))";
替换原来的sqlCreate变量内容后重新运行即可正常建表。
内容的提问来源于stack exchange,提问作者Franz Biberkopf
相关产品推荐
相关产品推荐

