PostgreSQLでの制約名の更新


94

Postgresで制約名を変更することは可能ですか?PKを追加しました:

ALTER TABLE contractor_contractor ADD CONSTRAINT commerce_contractor_pkey PRIMARY KEY(id);

また、システムの他の部分と一貫性を保つために、別の名前を付けたいと思います。既存のPK制約を削除して、新しい制約を作成しますか?それとも、それを管理するための「ソフト」な方法はありますか?

ありがとう!

回答:


83

主キーの場合、次のことができるはずです。

ALTER INDEX commerce_contractor_pkey RENAME TO whatever_new_name

ただし、他のタイプの制約では機能しません。最良のオプションは、古いものを削除して新しいものを作成することです。必ずトランザクション内で実行してください。そうすれば、システムは再構築中にそれなしでは動作しません。(トランザクションでそれを実行できない場合は、古いものを削除する前に、必ず最初に新しいものを作成してください)


160

既存の制約の名前を変更するにはPostgreSQL 9.2以降では、使用することができますALTER TABLEを

ALTER TABLE name RENAME CONSTRAINT constraint_name TO new_constraint_name;

1
@ArturoHerrero一度に複数の制約の名前を変更できますか?はいの場合、どのように変更しますか?
Erlan 2017年

1
@Erlanはpg_catalog、クエリを介してすべての制約のリストを取得し、それを繰り返し処理しLOOP、動的クエリを使用して名前を変更できます。
Evgeny Nozdrev 2018年

2

主キーはメインテーブル名よりも遅れることが多いことがわかりました。このスクリプトは、問題のあるものを特定して修正するのに役立ちました。

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バイト)を考慮に入れることです。

明らかに、実行する前に何が返されるかを確認してください。それが他の人に役立つことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.