Postgresで制約名を変更することは可能ですか?PKを追加しました:
ALTER TABLE contractor_contractor ADD CONSTRAINT commerce_contractor_pkey PRIMARY KEY(id);
また、システムの他の部分と一貫性を保つために、別の名前を付けたいと思います。既存のPK制約を削除して、新しい制約を作成しますか?それとも、それを管理するための「ソフト」な方法はありますか?
ありがとう!
Postgresで制約名を変更することは可能ですか?PKを追加しました:
ALTER TABLE contractor_contractor ADD CONSTRAINT commerce_contractor_pkey PRIMARY KEY(id);
また、システムの他の部分と一貫性を保つために、別の名前を付けたいと思います。既存のPK制約を削除して、新しい制約を作成しますか?それとも、それを管理するための「ソフト」な方法はありますか?
ありがとう!
回答:
既存の制約の名前を変更するにはPostgreSQL 9.2以降では、使用することができますALTER TABLEを:
ALTER TABLE name RENAME CONSTRAINT constraint_name TO new_constraint_name;
pg_catalog
、クエリを介してすべての制約のリストを取得し、それを繰り返し処理しLOOP
、動的クエリを使用して名前を変更できます。
主キーはメインテーブル名よりも遅れることが多いことがわかりました。このスクリプトは、問題のあるものを特定して修正するのに役立ちました。
select
table_name,
constraint_name ,
'ALTER TABLE ' || table_name || ' RENAME CONSTRAINT ' || constraint_name || ' TO ' || left(table_name, 58) || '_pkey;'
from information_schema.table_constraints tc
where constraint_type = 'PRIMARY KEY'
and constraint_name <> left(table_name, 58) || '_pkey';
これにより、主キー名が「デフォルト」パターン(<tablename>_pkey
)ではなくなったすべてのテーブルが検索され、それぞれの名前変更スクリプトが作成されます。
上記のコードの上記の58文字の制限は、制約名の最大サイズ(63バイト)を考慮に入れることです。
明らかに、実行する前に何が返されるかを確認してください。それが他の人に役立つことを願っています。