lealone / Lealone

比 MySQL 和 MongoDB 快10倍的 OLTP 关系数据库和文档数据库
Other
2.44k stars 513 forks source link

添加CLOB字段后现有的数据查询不出来 #161

Closed cbqqkcel closed 1 year ago

cbqqkcel commented 1 year ago

alter table DEFINE add FORM_VALUE CLOB;

执行添加字段,查询数据报

[2022-09-28 20:40:50] [HY000][50000] General error: "java.lang.ArrayIndexOutOfBoundsException: 19"; SQL statement:
[2022-09-28 20:40:50] SELECT t.*
[2022-09-28 20:40:50] FROM "PUBLIC".INSTANCE t [50000-0]

把数据全部删除后再添加是可以的。

codefollower commented 1 year ago

是你的客户端连了名为 lealone 的数据库,然后在里面建表增加新字段吧, lealone 这个数据库是系统数据库,我原本的设计是不给普通用户在里面建表的,只给系统使用,系统设计的表是不会修改表结构的,所以就没有 table_alter_history 这个系统表,有了这个表新加字段时就在里面登记,然后现有的老记录读这个表就会构建出新的字段值,如果没有这个表,当使用 select * from t 时,字段变成3个了,但是原有的老记录还是两个字段,所以就抛异常了。

总之,业务系统不建议直接在 lealone 这个系统数据库里面存放业务的任何数据,这个 lealone 数据库只给系统用,以后随时会改。

你用 create database xxx 创建新的数据库即可,新创建的数据库默认用户名也是 root 密码也是空。

codefollower commented 1 year ago

lealone 这个系统数据库里的 root 用户拥有最高权限,所以在实际项目中只用它执行 create database 语句即可, create database 语句创建的是应用数据库,只有 lealone 这个系统数据库里的 root 用户有这个权限。

每个应用数据库有自己的一套用户,默认会创建它的 root 用户,应用数据库的 root 用户在应用数据库中有最高权限,但是它依然无法访问其他应用数据库。

cbqqkcel commented 1 year ago

我确实是用的 lealone 但是最好提醒一下,要不然后面还会有人问得。

codefollower commented 1 year ago

mysql 自带了四个数据库:sys、mysql、information schema、performance schema。才发现前两个可以在里面创建用户自己的表的。lealone 也自带了一个叫 lealone 的系统数据库,为了方便测试,也允许用户在里面建表,但是吧总觉得这样子不合适,哪天数据库厂商加了新表跟用户的表名冲突了怎么办。

所以我对这个设计也还没有完全满意,最后可能加个开关,测试阶段把 lealone 这个系统数据库当成普通的数据库使用,上线之后关掉,不允许用户在里面添加任何东西了。

codefollower commented 1 year ago

我找到合适的办法了,目前在 lealone 里每个 database 都自带两个 schema:public 和 information,我只要让 information 不给应用添加任何东西即可,public 是应用的默认 schema。这样在测试阶段应用不用创建 database 直接用 lealone 这个系统 database 也是安全的。

codefollower commented 1 year ago

@qqcbqqkcel 问题已经修复,感谢报告问题。