1

列名に基づいて制約を削除する方法はありますか?

postgres 8.4 を使用していますが、プロジェクトをアップグレードすると、バージョンが異なると制約の名前が異なるため、アップグレードが失敗します。

基本的に、制約が存在する場合は制約を削除する必要があります。または、列名を使用して制約を削除するだけです。

制約の名前だけが変更されています。それが可能かどうか、何か考えはありますか?

この場合、「patron_username_key」を削除する必要があります

discovery=# \d patron
                       Table "public.patron"
          Column          |            Type             | Modifiers
--------------------------+-----------------------------+-----------
 patron_id                | integer                     | not null
 create_date              | timestamp without time zone | not null
 row_version              | integer                     | not null
 display_name             | character varying(255)      | not null
 username                 | character varying(255)      | not null
 authentication_server_id | integer                     |
Indexes:
    "patron_pkey" PRIMARY KEY, btree (patron_id)
    "patron_username_key" UNIQUE, btree (username, authentication_server_id)
4

2 に答える 2

2

システム カタログを使用して、制約に関する情報を見つけることができます。それでも、キーなどの一部の制約は別のpg_constraint表に記載されていますが、その他の制約 ( などNOT NULL) は基本的に表の列pg_attributeです。

キーについては、次のクエリを使用して制約定義のリストを取得できます。

SELECT pg_get_constraintdef(c.oid) AS def
  FROM pg_class t
  JOIN pg_constraint c ON c.conrelid=t.oid
 WHERE t.relkind='r' AND t.relname = 'table';

次に、列を参照するものを除外して、ALTER TABLE ... DROP CONSTRAINT ...ステートメントを動的に構築できます。

于 2012-10-17T19:17:20.470 に答える
1

一意のインデックスが一意の制約を追加した結果であると想定すると、次のSQLステートメントを使用してその制約を削除できます。

do $$
declare 
  cons_name text;
begin
  select constraint_name 
     into cons_name
  from information_schema.constraint_column_usage  
  where constraint_schema = current_schema()
  and column_name in ('authentication_server_id', 'username')
  and table_name = 'patron'
  group by constraint_name
  having count(*) = 2;

  execute 'alter table patron drop constraint '||cons_name;
end;
$$

(一意の制約ではなく)一意のインデックスを「のみ」追加した場合に、これが機能するかどうかはわかりません。

having count(*) = 22列を超える場合は、条件の列数に一致するようにパーツを調整する必要もありcolumn_name in ..ます。

(PostgreSQLのバージョンを指定しなかったため、現在のバージョンを想定しています)

于 2012-10-17T19:27:04.010 に答える