Эти два способа определения внешних ключей различны? - PullRequest
0 голосов
/ 07 сентября 2011

В следующем определении таблицы, в чем разница между этими двумя определениями столбцов, или второе создает просто автоматически именуемый индекс внешнего ключа?

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 ... */
);

Ответы [ 3 ]

2 голосов
/ 07 сентября 2011

Единственная реальная разница в том, что последний получит системное имя. Первый - рекомендуемый метод, хотя я признаю, что я ленивый и иногда использую последний.

Еще одно отличие, которое вы заметите, если присмотритесь, заключается в том, что для столбца sys.foreign_keys.is_system_named установлено значение 1, если вы сами не указали имя.

2 голосов
/ 07 сентября 2011

Единственное отличие состоит в том, что второму будет присвоено сгенерированное системой имя, которое, вероятно, будет более загадочным, чем то, которое вы сами себе выделяете.

Имя столбца также необязательно, если существует однозначная возможность.

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 ] 
 } 

Дополнительные элементы заключены в квадратные скобки.

1 голос
/ 07 сентября 2011

И в ответ на ваш второй вопрос, ни один из них не создает индекс.Если вы хотите, чтобы поле FK было проиндексировано (и большую часть времени вы это делаете), вам нужно создать индекс для поля.

...