web-dev-qa-db-ja.com

PostgreSQL:デフォルトの制約名

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. そうでない場合、矛盾を防ぐためにデフォルト名を完全に避けるべきですか?

64
Ian Mackinnon

manual はこれについてかなり明確です( "tableconstraint:この形式はCREATE TABLEと同じ構文を使用してテーブルに新しい制約を追加します。 ")

だからあなたは単に実行することができます:

 ALTER TABLEの例ADD UNIQUE(a、b); 
29

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

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

ここで、接尾辞は次のいずれかです。

  • pkeyは主キー制約用
  • keyユニーク制約
  • 除外制約の場合はexcl
  • idxその他の種類のインデックスの場合
  • fkeyは外部キー用
  • checkチェック制約の場合

シーケンスの標準接尾辞は

  • seqすべてのシーケンス

一意制約の証明:

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

215
Frank Heikens