解决H2创建表的时候出现的expected “ARRAY, INVISIBL...问题

在使用H2数据库时遇到创建表的语法错误,问题在于INT(11)和BOOLEAN(1)的语法不被支持。解决方案是将INT(11)改为INT,去除括号,并将BOOLEAN(1)改为BOOLEAN。同时,主键的NOT NULL约束是不必要的,因为默认情况下标识列就是NOT NULL。修改后的SQL语句能够成功创建表。
摘要由CSDN通过智能技术生成

目录

报错信息

背景介绍

解决方案

原因解析

报错信息

[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,但这种错误的子句顺序没有记录,也不受支持。

如果你在将C#对象序列化为JSON时遇到了错误消息 "C# Object serialized to Array. JObject instance expected.",这可能是因为你使用了`JObject`而不是`JArray`来表示序列化后的JSON数据。 `JObject`表示一个JSON对象,而`JArray`表示一个JSON数组。根据错误消息,你可能期望得到一个`JObject`实例,但实际上得到的是一个`JArray`实例。 为了解决这个问题,你需要检查你的代码,确保你使用了适当的`JObject`或`JArray`来表示你的JSON数据。 例如,如果你要序列化一个对象并将其放入一个JSON数组中,你可以使用`JArray`来包装这个对象。下面是一个示例代码: ```csharp using Newtonsoft.Json; using Newtonsoft.Json.Linq; // 创建一个对象 Person person = new Person { Name = "John", Age = 30 }; // 将对象放入一个JArray中 JArray jsonArray = new JArray(); jsonArray.Add(JObject.FromObject(person)); // 将JArray转换为JSON字符串 string json = jsonArray.ToString(); // 输出结果 Console.WriteLine(json); // 定义一个可序列化的Person类 public class Person { public string Name { get; set; } public int Age { get; set; } } ``` 在上面的示例中,我们首先创建了一个`Person`对象,然后将其放入一个`JArray`中,最后将`JArray`转换为JSON字符串并输出。 输出结果将是: ``` [{"Name":"John","Age":30}] ``` 请注意,如果你期望得到的是一个`JObject`实例而不是`JArray`,请检查你的代码,确保你正确地构建了`JObject`。 希望这可以解决你的问题!如果你有任何其他疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值