目录
报错信息
[42001][42001] Syntax error in SQL statement "CREATE TABLE simple\000d\000a(id bigint[*](10) ,\000d\000aname varchar(50),\000d\000aage int ,\000d\000aemail varchar (50)\000d\000a)"; expected "ARRAY, INVISIBLE, VISIBLE, NOT, NULL, AS, DEFAULT, GENERATED, ON, NOT, NULL, AUTO_INCREMENT, DEFAULT, NULL_TO_DEFAULT, SEQUENCE, SELECTIVITY, COMMENT, CONSTRAINT, COMMENT, PRIMARY, UNIQUE, NOT, NULL, CHECK, REFERENCES, AUTO_INCREMENT, ,, )"; SQL statement:
背景介绍
在使用里的H2作为初始项目的时候,出现了一直创建不了表的问题。
DROP TABLE IF EXISTS user;
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
解决方案
DROP TABLE IF EXISTS simple_user;
CREATE TABLE simple_user
(
id BIGINT NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
原因解析
INT(11)只允许在MySQL和MariaDB兼容模式下使用,但H2是忽略指定精度的,也就是说不允许出现括号以及里面的限制。在H2 2.0的所有其他兼容模式下,此定义都被拒绝,需要使用INT或INTEGER。
其次也不允许使用BOOLEAN(1),如果它在1.4.200中工作,那么它就是解析器中的一个错误。你需要使用BOOLEAN。
AUTO_INCREMENT子句通常也应该仅在MySQL和MariaDB兼容模式下使用,但它也可以在常规模式下使用。正确的子句是DEFAULT AS IDENTITY生成的,并且主键和标识列不需要显式的NOT NULL约束,您可以删除它。约束通常也应该在所有其他子句之后指定,在H2实际接受标识选项之前不为NULL,但这种错误的子句顺序没有记录,也不受支持。