Подтвердить что ты не робот

Различия между "внешним ключом" и "ограниченным внешним ключом",

Я имею в виду, например, я могу создать таблицу типа

create table XTable
( 
  idt int not null primary key,
  value nvarchar(50),
  idq int,
  constraint fk_idq foreign key(idq) references YTable(idq)
)

и я могу создать его вот так

create table XTable
(
  idt int not null primary key,
  value nvarchar(50),
  idq int,
  foreign key(idq) references YTable(idq)
)

Я обычно создаю таблицу, как во втором примере, но теперь мне любопытен первый пример. В чем разница?

4b9b3361

Ответ 1

Первая опция предназначена для обозначения ограничения.

От SQL FOREIGN KEY Constraint

Чтобы разрешить именовать ограничение FOREIGN KEY и определять ограничение FOREIGN KEY для нескольких столбцов, используйте следующий синтаксис SQL

CREATE TABLE Orders
 (
 O_Id int NOT NULL,
 OrderNo int NOT NULL,
 P_Id int,
 PRIMARY KEY (O_Id),
 CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
 REFERENCES Persons(P_Id)
 )

Кроме того, из CREATE TABLE (Transact-SQL) видно, что [ CONSTRAINT constraint_name ] является необязательным.

Ответ 2

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

Пользовательские имена внешних ключей могут быть полезны для следующих операторов:

ALTER TABLE XTable DROP    CONSTRAINT fk_idq;
ALTER TABLE XTable ENABLE  CONSTRAINT fk_idq;
ALTER TABLE XTable DISABLE CONSTRAINT fk_idq;

Сложнее изменять ограничения с помощью системных имен, так как сначала вы должны их открыть.

Ответ 3

Помимо управления именем, ничего действительно. SQL Server будет указывать имя, если вы его опустите. FYI, вам нужен только этот синтаксис (SQL Fiddle):

create table XTable
(
  idt int not null primary key,
  value nvarchar(50),
  idq int references YTable(idq)
)

Здесь более полный пример.