как добавить уникальное ограничение таблицы sql в качестве ссылки внешнего ключа на другую таблицу sql в sql server 2005
Добавьте уникальное ограничение таблицы sql в качестве ссылки внешнего ключа на другую таблицу sql.
Ответы (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);
Извините, но я не совсем уверен, что вы спрашиваете здесь. Было бы полезно привести больше примеров с определениями таблиц! Думаю, вы говорите, что у вас есть два столбца в таблице 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 с двумя столбцами для другой таблицы.
Вы должны иметь в виду, что добавление FK к столбцу не приводит к автоматическому добавлению индекса в этот столбец. Вам нужно будет сделать это в два этапа.
1) Make a column in your table a FK to a parent table.
2) Add a unique constraint on that same column
Забудьте пока об уникальном ограничении. Просто создайте новый внешний ключ в двух столбцах.
ALTER TABLE dbo.PurchaseDetail
ADD FOREIGN KEY (Customer, Product)
REFERENCES dbo.Purchase (Customer, Product)
Я предпочитаю такой подход, когда эта таблица ссылается на другую таблицу (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
);