PostgreSQL:デフォルトの制約名


88

PostgreSQLでテーブルを作成する場合、指定されていない場合はデフォルトの制約名が割り当てられます。

CREATE TABLE example (
    a integer,
    b integer,
    UNIQUE (a, b)
);

しかしALTER TABLE、制約を追加するために使用すると、名前が必須のようです。

ALTER TABLE example ADD CONSTRAINT my_explicit_constraint_name UNIQUE (a, b);

これにより、私が取り組んだプロジェクトで名前の不一致が発生し、次の質問が表示されます。

  1. テーブルの作成中に追加された場合に受け取る名前で、既存のテーブルに制約を追加する簡単な方法はありますか?

  2. そうでない場合は、不整合を防ぐためにデフォルト名を完全に回避する必要がありますか?


3
この理由だけでデフォルト名を避けることをルールにしています-すべてのデプロイメントで制約の名前が異なるという状況になってしまいます。
Paul Tomblin 2010年

回答:


36

マニュアルでは、この(「についてかなり明確である:このフォームは、CREATE TABLEと同じ構文を使用して、テーブルに新しい制約を追加します。tableconstraint」)

したがって、簡単に実行できます。

ALTERTABLEの例ADDUNIQUE(a、b);

5
ああ!私は誤って含めたCONSTRAINTようにALTER TABLE example ADD CONSTRAINT UNIQUE (a, b);、エラーを取得します。ありがとうございました!
Ian Mackinnon 2010年

282

PostgreSQLのインデックスの標準名は次のとおりです。

{tablename}_{columnname(s)}_{suffix}

ここで、サフィックスは次のいずれかです。

  • pkey 主キー制約の場合
  • key 一意性制約の場合
  • excl 除外制約の場合
  • idx 他の種類のインデックスの場合
  • fkey 外部キーの場合
  • check チェック制約の場合

シーケンスの標準サフィックスは

  • seq すべてのシーケンス

あなたのユニークな制約の証明:

注意:CREATE TABLE / UNIQUEは、テーブル「example」の暗黙的なインデックス「example_a_b_key」を作成します


10
とても便利です、ありがとう!外部キーはサフィックスfkeyを使用し、複数列の外部キー制約には最初の列名のみが含まれているように見えることを追加する価値があります。
Ian Mackinnon 2010年

1
@IanMackinnon、これが最良の答えになるはずです!
Marcio Mazzucato 2014

この情報はゴールドです!これらを確認するには、たとえばCREATE TABLE mytable (mycolumn numeric UNIQUE);
jmagnusson 2014

6
「postgresqlインデックスの命名規則」をグーグルで検索するときに私が探していた正確な答え
Fancy John

1
@someoneああすみません、私はE.4.3.3ユーティリティコマンドの終わりを意味したと思います。これは、E.4.3.4データ型前の最後の箇条書き項目です:「外部キーしました。(Peter Eisentraut)のデフォルトの制約名を選択する際、すべてのキー列の名前を使用してください」
マイケル・ヒューソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.