Вопрос по h2, database, sql – Удаление уникального ограничения для столбца в H2

7

Я пытаюсь удалить уникальное ограничение для столбца в h2, ранее созданный какinfo varchar(255) unique.

Я старался:

<code>sql> alter table public_partner drop constraint (select distinct unique_index_name from in
formation_schema.constraints where table_name='PUBLIC_PARTNER' and column_list='INFO');
</code>

Но безуспешно (как следует):

<code>Syntax error in SQL statement "ALTER TABLE PUBLIC_PARTNER DROP CONSTRAINT ([*]SELECT DISTI
NCT UNIQUE_INDEX_NAME FROM INFORMATION_SCHEMA.CONSTRAINTS WHERE TABLE_NAME='PUBLIC_PARTNER
' AND COLUMN_LIST='INFO') "; expected "identifier"; SQL statement:
alter table public_partner drop constraint (select distinct unique_index_name from informa
tion_schema.constraints where table_name='PUBLIC_PARTNER' and column_list='INFO') [42001-1
60]
</code>

Как правильно устранить это ограничение?

Кстати:

<code>sql> (select unique_index_name from information_schema.constraints where table_name='PUBLI
C_PARTNER' and column_list='INFO');
UNIQUE_INDEX_NAME
CONSTRAINT_F574_INDEX_9
(1 row, 0 ms)
</code>

кажется, возвращает правильный вывод.

Ваш Ответ

2   ответа
5

ески созданного оператора. Сначала создатьexecute псевдоним (только один раз):

CREATE ALIAS IF NOT EXISTS EXECUTE AS $$ void executeSql(Connection conn, String sql) 
throws SQLException { conn.createStatement().executeUpdate(sql); } $$;

Затем вызвать этот метод:

call execute('ALTER TABLE PUBLIC_PARTNER DROP CONSTRAINT ' || 
    (select distinct unique_index_name from in formation_schema.constraints 
    where table_name='PUBLIC_PARTNER' and column_list='INFO'));

... гдеexecute пользовательская функция, которая запускает оператор

используя это решение, но оно терпит неудачу сFeature not supported: "VARCHAR +"; SQL statement:, Мой код:call execute('ALTER TABLE DAILY_AGGREGATES DROP CONSTRAINT '+ (select distinct constraint_name from information_schema.constraints where table_name='DAILY_AGGREGATES' and constraint_type='PRIMARY KEY'));
В SQL+ не используется для объединения строк. Вместо этого используйте||, Как в:call execute('ALTER TABLE DAILY_AGGREGATES DROP CONSTRAINT ' || (select distinct constraint_name from information_schema.constraints where table_name='DAILY_AGGREGATES' and constraint_type='PRIMARY KEY'));
Это будет пользовательская функция:CREATE ALIAS IF NOT EXISTS EXECUTE AS $$ void executeSql(Connection conn, String sql) throws SQLException { conn.createStatement().executeUpdate(sql); } $$;
@ThomasMueller большое спасибо, теперь это работает!
10

о запустить два оператора:

select distinct constraint_name from information_schema.constraints 
where table_name='PUBLIC_PARTNER' and column_list='INFO'

а затем получить имя идентификатора и запустить оператор

ALTER TABLE PUBLIC_PARTNER DROP CONSTRAINT <xxx>
После этого я получил & lt; Constraint & lt; xxx & gt; не найден & quot ;. Это сработало для меня с & quot; constraint_name & quot; вместо & quot; unique_index_name & quot ;, чтобы выбор былselect distinct constraint_name from in formation_schema.constraints where table_name='PUBLIC_PARTNER' and column_list='INFO'  Можно также дополнительно ограничить тип ограничения, добавив `AND constraint_type =" UNIQUE ". Моя версия H2 была 1.3.166 между прочим.
Это как раз то, что мне нужно, и я так близко ... Вы не понимаете, как получить имя идентификатора, и мне очень трудно разобраться (я использую H2).
Спасибо, Томас! Я ожидал, что вы лично ответите на мой вопрос :) Проблема в том, что ваше решение очевидно для меня, и я в любом случае приму ваш ответ как полезный. Плохо то, что мне нужно, чтобы автоматизировать мой дельта-скрипт без ручного вмешательства: ((( Alec
@MartinGrotzke Спасибо! Я обновил свой ответ (в "information_schema" также была опечатка).

Похожие вопросы