Добавьте уникальное ограничение таблицы sql в качестве ссылки внешнего ключа на другую таблицу sql.

как добавить уникальное ограничение таблицы sql в качестве ссылки внешнего ключа на другую таблицу sql в sql server 2005


person subash    schedule 19.11.2010    source источник


Ответы (5)


Чтобы добавить ограничение FK (в дочерней таблице к родительской таблице), вы должны добавить уникальное ограничение в столбцы отношения родительской таблицы.
Все остальное необязательно или не имеет ничего общего с FK:

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

Родительская таблица (в таком отношении FK) часто вызывается (в том числе SSMS) как таблица первичного ключа, но PK не является обязательным, достаточно уникального ключа/ограничения в родительской таблице (поскольку PK уникален, это частный случай уникального ограничения в родительская таблица).

Удалите TableA и TableB из ответ Мэтта, который сбивает с толку новичков,
и воссоздайте их как

CREATE TABLE parentB--TableB 
(
    PK1 INT NOT NULL,
    PK2 INT NOT NULL,
    --I would not have additional non-referenced data in parent table, 
    --rather in child table
    --SomeData VARCHAR(1000),

    --CONSTRAINT PK_TableB PRIMARY KEY CLUSTERED (PK1, PK2)
)

CREATE TABLE childA--TableA 
(
    --PK INT, -- NOT NULL,
    FK1 INT-- NOT NULL,  -- Or NULL, if you''d rather.
    FK2 INT --NOT NULL --,
    , SomeData VARCHAR(1000)
    --CONSTRAINT PK_TableA PRIMARY KEY CLUSTERED (PK),
    --CONSTRAINT FK_TableA_FK1FK2 FOREIGN KEY (FK1, FK2) REFERENCES TableB (PK1, PK2),
    --CONSTRAINT Cons2cols UNIQUE(FK1, FK2)
)

Теперь по порядку, чтобы добавить FK

ALTER TABLE childA 
ADD 
--constraint FK1_childA 
--this is optional, if one needs to add his own custom name
FOREIGN KEY (FK1) REFERENCES parentB(PK1); 

вы должны сначала создать уникальное ограничение для соответствующего ссылочного столбца в столбце родительской таблицы:

ALTER TABLE parentB ADD 
--CONSTRAINT YourUniqueName --uncomment for adding your own name to constraint
UNIQUE(PK1) 

Аналогично для двух столбцов ограничения внешнего ключа
(во-первых, вам нужно соответствующее уникальное ограничение в родительской таблице):

ALTER TABLE parentB ADD 
--CONSTRAINT YourUniqueName --for adding your own name to unique constraint
UNIQUE(PK1,PK2)  

ALTER TABLE childA 
ADD 
--constraint yourUniqueName --uncomment for adding your own name to FK constraint
FOREIGN KEY (FK1, FK2) REFERENCES parentB(PK1, PK2); 
person Gennady Vanin Геннадий Вани&    schedule 21.11.2010

Извините, но я не совсем уверен, что вы спрашиваете здесь. Было бы полезно привести больше примеров с определениями таблиц! Думаю, вы говорите, что у вас есть два столбца в таблице A в уникальном ограничении с именем "Cons2cols", и вы также хотите, чтобы эти два столбца были FK для пары PK/unqiue из двух столбцов в TableB.

Это работает следующим образом, если вы создаете таблицы с нуля:

CREATE TABLE TableB (
    PK1 INT NOT NULL,
    PK2 INT NOT NULL,
    SomeData VARCHAR(1000),

    CONSTRAINT PK_TableB PRIMARY KEY CLUSTERED (PK1, PK2)
)

CREATE TABLE TableA (
    PK INT NOT NULL,
    FK1 INT NOT NULL,  -- Or NULL, if you''d rather.
    FK2 INT NOT NULL,
    CONSTRAINT PK_TableA PRIMARY KEY CLUSTERED (PK),
    CONSTRAINT FK_TableA_FK1FK2 FOREIGN KEY (FK1, FK2) REFERENCES TableB (PK1, PK2),
    CONSTRAINT Cons2cols UNIQUE(FK1, FK2)
)

Если таблицы уже существуют, вы можете добавить эти же ограничения постфактум:

ALTER TABLE TableA ADD CONSTRAINT FK_TableA_FK1FK2 FOREIGN KEY (FK1, FK2) REFERENCES TableB (PK1, PK2);
ALTER TABLE TableA ADD CONSTRAINT Cons2cols UNIQUE(FK1, FK2);

В любом случае, TableA теперь имеет уникальный FK с двумя столбцами для другой таблицы.

person Matt    schedule 19.11.2010

Вы должны иметь в виду, что добавление FK к столбцу не приводит к автоматическому добавлению индекса в этот столбец. Вам нужно будет сделать это в два этапа.

1) Make a column in your table a FK to a parent table.
2) Add a unique constraint on that same column
person Randy Minder    schedule 19.11.2010
comment
но у меня есть два столбца, добавленные к уникальному ограничению Cons2cols. Я хочу сопоставить этот Cons2cols как внешний ключ с таблицей - person subash; 19.11.2010
comment
Извините, я не совсем понимаю, о чем вы спрашиваете или говорите. - person Randy Minder; 19.11.2010

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

ALTER TABLE dbo.PurchaseDetail
ADD FOREIGN KEY (Customer, Product)
    REFERENCES dbo.Purchase (Customer, Product)
person Anthony Faull    schedule 21.11.2010

Я предпочитаю такой подход, когда эта таблица ссылается на другую таблицу (transaction_log):

CREATE TABLE transaction_settings_log
(
    transaction_fk UUID NOT NULL
        CONSTRAINT transaction_log_pkey REFERENCES transaction_log (id) UNIQUE,
    group_selected BOOLEAN DEFAULT TRUE,
    leg_closed     BOOLEAN DEFAULT FALSE
);
person Mircea Stanciu    schedule 18.07.2019