Самостоятельная ссылка колонка может повредить базу данных H2 - PullRequest
1 голос
/ 14 июня 2011

Попробуйте следующее на 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)

BTW.Пожалуйста, не отвечайте "использовать auto_increment".Да, я знаю о auto_increment столбцах.Столбцы с автоинкрементом оставляют пробелы после отката и не работают со всеми типами данных.Например, как можно автоматически увеличить столбец, в котором приложение использует алгоритм, который не добавляет постоянное целое число?Кроме того, нет способа получить семантически auto_increment a VARCHAR, но ваше приложение может иметь вполне разумное представление.

1 Ответ

3 голосов
/ 15 июня 2011

Решением является использование функции 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;

Кстати, «кирпич» относительный ... вы все равно можете получить данные, используя инструмент восстановления. Но, конечно, это нехорошо, и будет исправлено в следующем выпуске. Проблема в том, что H2 не ограничивает то, что вы можете сделать в предложении по умолчанию. Другие базы данных просто не допускают никаких запросов в предложении по умолчанию, но я думаю, что это робко (это правильное слово?), Я постараюсь найти лучшее решение (возможно, разрешить это). Что вы предлагаете?

...