0

次のテーブル定義では、これら 2 つの列定義の違いは何ですか? または、2 番目の定義は、自動的に名前が付けられた外部キー インデックスを作成するだけですか?

CREATE TABLE dbo.Employee
(
    dept_id     int  NOT NULL  
        CONSTRAINT fk_employee_deptid FOREIGN KEY REFERENCES Department(dept_id),
    empType_id  int  NOT NULL  REFERENCES  EmployeeType(empType_id)
    /* ... other columns ... */
);
4

3 に答える 3

3

唯一の実際の違いは、後者がシステム定義の名前を取得することです。前者が推奨される方法ですが、私は怠け者であり、後者を使用することもあります。

よく見てみるとわかるもう 1 つの違いは、sys.foreign_keys.is_system_named自分で名前を指定しないと列が 1 に設定されることです。

于 2011-09-06T21:18:12.987 に答える
3

唯一の違いは、2 番目の名前にはシステムが生成した名前が付けられることです。これは、自分で割り当てた名前よりも暗号化されている可能性があります。

明確な可能性がある場合、列名もオプションです。

empType_id  int  NOT NULL  REFERENCES  EmployeeType

働くこともできます。繰り返しますが、最終結果に違いはありません。FK 宣言の完全な文法は次のとおりです。

[ CONSTRAINT constraint_name ] 
{      [ FOREIGN KEY ] 
        REFERENCES [ schema_name . ] referenced_table_name [ ( ref_column ) ] 
        [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
        [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
        [ NOT FOR REPLICATION ] 
 } 

オプション項目は角括弧で囲みます。

于 2011-09-06T21:16:16.310 に答える
2

そして、2番目の質問に答えると、どちらもインデックスを作成しません。FKフィールドにインデックスを付けたい場合(そしてほとんどの場合)、フィールドにインデックスを作成する必要があります。

于 2011-09-06T21:55:13.430 に答える