80

Oracleが提供するドキュメントを確認し、テーブルを削除せずに制約を変更する方法を見つけました。問題は、キーワードを認識しないため、変更時にエラーが発生することです。

PostgreSQL用のEMSSQLManagerの使用。

Alter table public.public_insurer_credit MODIFY CONSTRAINT public_insurer_credit_fk1
    deferrable, initially deferred;

:を使用して制約を削除することで、これを回避することができました。

ALTER TABLE "public"."public_insurer_credit"
  DROP CONSTRAINT "public_insurer_credit_fk1" RESTRICT;

ALTER TABLE "public"."public_insurer_credit"
  ADD CONSTRAINT "public_insurer_credit_fk1" FOREIGN KEY ("branch_id", "order_id", "public_insurer_id")
    REFERENCES "public"."order_public_insurer"("branch_id", "order_id", "public_insurer_id")
    ON UPDATE CASCADE
    ON DELETE NO ACTION
    DEFERRABLE 
    INITIALLY DEFERRED;
4

4 に答える 4

145

ALTERPostgresには制約のコマンドはありません。これを実現する最も簡単な方法は、制約を削除し、必要なパラメーターを使用して再度追加することです。もちろん、制約の変更は現在のテーブルデータに対して実行されます。

BEGIN;
ALTER TABLE t1 DROP CONSTRAINT ...
ALTER TABLE t1 ADD CONSTRAINT ...
COMMIT;
于 2011-11-30T17:50:34.543 に答える
45

正しいマニュアル(OracleではなくPostgreSQLによって提供されている)によると、ALTERTABLEステートメントで使用できる変更制約はありません。

正しいマニュアルへのリンクは次のとおりです。

http://www.postgresql.org/docs/current/static/sql-altertable.html

于 2011-11-30T17:49:07.343 に答える
42

バージョン 9.4 以降、PostgreSQL はALTER TABLE ... ALTER CONSTRAINT外部キーをサポートしています。

この機能は"Allow constraint attributes to be altered, so the default setting of NOT DEFERRABLE can be altered to DEFERRABLE and back."、あなたの質問を見て、あなたが探していたもの (のようなもの) だと思います。

より詳細な情報と例は、
http ://www.depesz.com/2013/06/30/waiting-for-9-4-alter-table-alter-constraint-for-fks/ にあります。

于 2013-08-27T20:00:29.403 に答える
6

ALTER CONSTRAINT では外部キー名を知る必要がありますが、これは必ずしも便利ではありません。

これが関数で、テーブルと列の名前だけを知る必要があります。使用法:

select replace_foreign_key('user_rates_posts', 'post_id', 'ON DELETE CASCADE');

関数:

CREATE OR REPLACE FUNCTION 
    replace_foreign_key(f_table VARCHAR, f_column VARCHAR, new_options VARCHAR) 
RETURNS VARCHAR
AS $$
DECLARE constraint_name varchar;
DECLARE reftable varchar;
DECLARE refcolumn varchar;
BEGIN

SELECT tc.constraint_name, ccu.table_name AS foreign_table_name, ccu.column_name AS foreign_column_name 
FROM 
    information_schema.table_constraints AS tc 
    JOIN information_schema.key_column_usage AS kcu
      ON tc.constraint_name = kcu.constraint_name
    JOIN information_schema.constraint_column_usage AS ccu
      ON ccu.constraint_name = tc.constraint_name
WHERE constraint_type = 'FOREIGN KEY' 
   AND tc.table_name= f_table AND kcu.column_name= f_column
INTO constraint_name, reftable, refcolumn;

EXECUTE 'alter table ' || f_table || ' drop constraint ' || constraint_name || 
', ADD CONSTRAINT ' || constraint_name || ' FOREIGN KEY (' || f_column || ') ' ||
' REFERENCES ' || reftable || '(' || refcolumn || ') ' || new_options || ';';

RETURN 'Constraint replaced: ' || constraint_name || ' (' || f_table || '.' || f_column ||
 ' -> ' || reftable || '.' || refcolumn || '); New options: ' || new_options;

END;
$$ LANGUAGE plpgsql;

注意: この関数は初期外部キーの属性をコピーしません。外部テーブル名/列名のみを取り、現在のキーを削除して新しいキーに置き換えます。

于 2015-10-03T09:25:13.270 に答える