8

以前にとして作成されたh2の列の一意性制約を削除しようとしていinfo varchar(255) uniqueます。

私は試した:

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');

しかし、成功しませんでした(次のように):

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]

この制約を正しく削除するにはどうすればよいですか?

ところで:

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)

正しい出力を返すようです。

4

3 に答える 3

13

SQL言語では、識別子名を式にすることはできません。次の2つのステートメントを実行する必要があります。

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

次に、識別子名を取得して、ステートメントを実行します

ALTER TABLE PUBLIC_PARTNER DROP CONSTRAINT <xxx>
于 2012-04-04T17:20:45.663 に答える
6

ユーザー定義関数を使用して、動的に作成されたステートメントを実行できます。最初にexecuteエイリアスを作成します(1回のみ):

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で、はステートメントを実行するユーザー定義関数です。

于 2012-04-05T08:05:58.820 に答える
1

PosgreSQLモードでSpringBootでH2を使用している場合、クエリにはスキーマを含める必要がpublicあり、テーブルは小文字モードである可能性があります。(以下をapplication.yml参照)

情報スキーマテーブルの大文字と小文字を確認し、表に示すように大文字と小文字を使用しますinformation_schema.constraints

詳細クエリセット

SET @constraint_name = QUOTE_IDENT(
              SELECT DISTINCT constraint_name
              FROM information_schema.constraints
              WHERE table_schema = 'public'
              AND table_name = 'public_partner'
              AND constraint_type = 'UNIQUE'
              AND column_list = 'info');

SET @command = 'ALTER TABLE public.public_partner DROP CONSTRAINT public.' || @constraint_name;

SELECT @command;

EXECUTE IMMEDIATE @command;

説明:

  • SELECT DISTINCTConstraint_name [...]

    スキーマ情報からUNIQUE制約を持つ列constraint_nameを選択します

  • QUOTE_IDENT([...])

    なぜこれが必要なのかわかりません。結果の文字列を引用します

  • SET @constraint_name = [...];

    変数@constraint_nameに格納します

  • SET @command = [...];

    文字列を連結してコマンド全体を作成し、変数@commandに格納します

  • SELECT @command;

    デバッグのためだけに、構成されたクエリを画面に表示します

  • EXECUTEIMMEDIATE@コマンド;

    @コマンドを実行する

Spring BootでのPostgreSQLモードでの一般的なH2構成application.yml(抽出)

spring:
  # [...]
  jpa:
    database-platform: org.hibernate.dialect.H2Dialect
  # [...]
  datasource:
    url: jdbc:h2:mem:testdb;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false
    username: sa
    password: sa
  # [...]
于 2020-09-04T07:36:48.657 に答える