Различия между "внешним ключом" и "ограниченным внешним ключом",
Я имею в виду, например, я могу создать таблицу типа
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)
)
Я обычно создаю таблицу, как во втором примере, но теперь мне любопытен первый пример. В чем разница?
Ответы
Ответ 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)
)
Здесь более полный пример.