может уникальный ключ (не первичный) быть родительским для декларативного ограничения внешнего ключа - PullRequest
2 голосов
/ 04 августа 2009

Наивный вопрос с ответом «Нет», я верю, но все же хотел бы задать.

Table_parent

pk_parent_surrogate  
parent_natural_unique_key


Table_child

pk_child_surrogate
child_natural_NOT_unique

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

pk_parent_surrogate ----------<  pk_child_surrogate

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

parent_natural_unique_key -------< child_natural_NOT_unique

Ответы [ 2 ]

2 голосов
/ 04 августа 2009

Мой ответ основан на моих знаниях MS SQL - хотя я считаю, что тот же ответ верен и для стандартов ANSI, я не уверен на 100% ...

ДА - вы МОЖЕТЕ делать это, если у вас есть уникальное ограничение на столбец в вашей родительской таблице, которое вы хотите использовать в качестве столбца привязки для ключа.

Вы можете создать ограничение FOREIGN KEY как часть определения таблицы при создании таблицы. Если таблица уже существует, вы можете добавить Ограничение FOREIGN KEY при условии, что Ограничение FOREIGN KEY связано с существующим Ограничения PRIMARY KEY или УНИКАЛЬНОЕ ограничение в другой или тот же стол. Таблица может содержать несколько ограничений FOREIGN KEY.

И как пример такого ключа ...

use tempdb

CREATE TABLE parent(
    pk int identity primary key, 
    candidate_key int unique not null)

CREATE TABLE child(
    pk int identity primary key, 
    join_key int references parent(candidate_key))

См. здесь для получения дополнительной информации.

0 голосов
/ 04 августа 2009

Попробуйте код, подобный этому:

create table testunique (id int identity(1,1) primary key, otherid int)
go
create unique index ixOther on testunique(otherid)
go
create table testFK (id int identity(1,1) primary key, someid int)
go
alter table testFK add constraint fkTest foreign key (someid) references testunique(otherid)

Rob

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...