gpt4 book ai didi

database - 自引用列可能会损坏 H2 数据库

转载 作者:搜寻专家 更新时间:2023-10-30 22:19:18 24 4
gpt4 key购买 nike

在您不介意删除的 H2DB 上尝试以下操作。 警告。这将不可逆转地损坏数据库!

  1. 创建一个带有自引用默认列的表。例如,使用 alter table 修改普通表:

    create table if not exists BRICK_H2( ID tinyint );
    alter table BRICK_H2 alter column ID set default ifnull(
    (select max(ID) from BRICK_H2 for update)+1,0
    );
  2. 关闭连接并关闭数据库。

  3. 再次启动数据库并尝试连接。错误时观察连接失败:

Table "BRICK_H2" not found; SQL statement:CREATE CACHED TABLE PUBLIC.BRICK_H2(    ID TINYINT DEFAULT IFNULL(((SELECT    MAX(ID)FROM PUBLIC.BRICK_H2    /* PUBLIC.BRICK_H2.tableScan */FOR UPDATE) + 1), 0)) [42102-155] 42S02/42102 (Help)

顺便说一句。请不要回应“使用auto_increment”。是的,我知道 auto_increment 列。自动递增列在回滚后会留下空白,并且不会处理所有数据类型。例如,在应用程序使用不是“添加常量整数”的算法的情况下,如何自动递增一列?此外,没有办法将 auto_increment 视为 VARCHAR,但您的应用程序可能有一个非常合理的概念。

最佳答案

一种解决方案是使用 Java 函数,例如:

drop all objects;
create table if not exists do_not_brick(id int);
create alias query as $$
String query(Connection conn, String sql) throws SQLException {
ResultSet rs = conn.createStatement().executeQuery(sql);
rs.next();
return rs.getString(1);
}$$;
alter table do_not_brick alter column id set default
ifnull(query('select max(id) from do_not_brick for update')+1, 0);
insert into do_not_brick() values(), (), ();
select * from do_not_brick;

顺便说一下,“砖 block ”是相对的……您仍然可以使用恢复工具检索数据。但当然这并不好,将在下一个版本中修复。问题是 H2 不限制您在默认子句中可以做什么。其他数据库根本不允许在 default 子句中进行任何查询,但我认为这很胆小(这是正确的词吗?),我会尝试找到更好的解决方案(可能允许)。你有什么建议?

关于database - 自引用列可能会损坏 H2 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6348598/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com