web-dev-qa-db-ja.com

制約の命名の目的は何ですか

制約に名前を付ける目的は何ですか(一意、主キー、外部キー)?

自然キーを主キーとして使用しているテーブルがあるとします。

CREATE TABLE Order
(
    LoginName        VARCHAR(50)    NOT NULL,
    ProductName      VARCHAR(50)    NOT NULL,
    NumberOrdered    INT            NOT NULL,
    OrderDateTime    DATETIME       NOT NULL,
    PRIMARY KEY(LoginName, OrderDateTime)
);

PKに名前を付けると、どんなメリットがありますか(ある場合)?

例えば。交換:

    PRIMARY KEY(LoginName, OrderDateTime)

と:

    CONSTRAINT Order_PK PRIMARY KEY(LoginName, OrderDateTime)

データモデルが最適でない場合は申し訳ありませんが、これは初めてです。

44
Andrew

これはかなり基本的な理由です。

(1)クエリ(挿入、更新、削除)が制約に違反している場合、SQLは制約名を含むエラーメッセージを生成します。制約名が明確で説明的であれば、エラーメッセージは理解しやすくなります。制約名がランダムなGUIDベースの名前である場合は、あまり明確ではありません。特にエンドユーザーにとっては、電話をかけて(大丈夫かもしれませんが)何を尋ねるでしょう "FK__B__B_COL1__75435199" 手段。

(2)将来的に制約を変更する必要がある場合(そうです、それが発生します)、その名前がわからない場合、それを行うのは非常に困難です。 (ALTER TABLE MyTable drop CONSTRAINT um ...)そして、「ゼロから」データベースのインスタンスを複数作成し、システムが生成したデフォルト名を使用すると、2つの名前が一致することはありません。

(3)コードをサポートする人(別名DBA)が、日曜日の午前3時にケース(1)またはケース(2)を処理するために無意味な時間を浪費しなければならない場合、彼らはおそらくコードの出所を特定し、それに応じて対応できるようにします。

100
Philip Kelley

将来的に制約を特定するには(たとえば、将来的にそれを削除したい場合)、一意の名前を付ける必要があります。名前を指定しない場合、データベースエンジンはおそらく奇妙な名前(一意性を確保するためにランダムなものを含むなど)を割り当てます。

9
Mehrdad Afshari

DBAを満足させるため、スキーマ定義を本番データベースに入れます。

3
user73774

コードが外部キーの制約にランダムに違反する場合、それがデバッグの時間を節約し、それがどれであるかを特定することが確実になります。それらに名前を付けると、挿入と更新のデバッグが大幅に簡略化されます。

3
Tim Howland

名前があなたに必要なすべての情報を与えてくれるので、実際の制約を見なくても誰かが制約が何をしているかを素早く知るのを助けます。

そのため、それが主キー、一意キー、デフォルトキーのいずれであるか、テーブル、および場合によっては関連する列であるかどうかを知っています。

2
James Black

すべての制約に正しく名前を付けることにより、特定の制約をデータモデルにすばやく関連付けることができます。これには2つの真の利点があります。

  1. エラーを迅速に特定して修正できます。
  2. 制約を確実に変更または削除できます。
1
GG.

制約に名前を付けることにより、それらの違反を区別できます。これは、管理者や開発者にとって便利なだけでなく、プログラムで制約名を使用することもできます。これは、エラーメッセージを解析するよりもはるかに堅牢です。制約名を使用することにより、違反した制約に応じて、プログラムの反応が異なります。

制約名は、データベースサーバーからユーザーに不可解なエラーメッセージを転送するだけでなく、制約違反の原因となったフィールドを示す適切なエラーメッセージをユーザーの言語で表示する場合にも非常に役立ちます。

PostgreSQLおよびJavaでこれを行う方法 に関する私の回答を参照してください。

0
Martin