Внешний ключ, ссылающийся на первичный ключ 2 столбца в SQL Server
Этот вопрос почти похож на на этот, но для SQL Server 2005:
У меня есть две таблицы в моей базе данных:
--'#' denotes the primary key
[Libraries]
#ID #Application Name
1 MyApp Title 1
2 MyApp Title 2
[Content]
#ID Application LibraryID Content
10 MyApp 1 xxx
11 MyApp 1 yyy
(база данных, очевидно, намного сложнее и имеет этот двойной ключ)
Каждая библиотека идентифицируется по ее уникальному идентификатору и имени приложения. Я пытаюсь обеспечить, чтобы каждый контент правильно ссылался на существующую библиотеку.
При создании ограничения (с помощью Мастера) в качестве
Primary key table Foreign key table
[Libraries] [Content]
ID ---> LibraryID
Application ---> Application
У меня есть следующая ошибка:
Столбцы в таблице "Библиотеки" не соответствуют существующему первичному ключу или УНИКАЛЬНОЕ ограничение
Есть ли у вас какое-то представление о том, что происходит? и если это вообще возможно с использованием SQL Server? (Я вообще не могу изменить таблицу [Library])
Большое спасибо за вашу помощь!
Ответы
Ответ 1
Конечно, можно создать отношение внешнего ключа к основному ключу (более одного столбца). Вы не указали нам выражение, которое используете, чтобы попытаться создать эти отношения - это должно быть что-то вроде:
ALTER TABLE dbo.Content
ADD CONSTRAINT FK_Content_Libraries
FOREIGN KEY(LibraryID, Application)
REFERENCES dbo.Libraries(ID, Application)
Это то, что вы используете? Если (ID, Application)
действительно является основным ключом на dbo.Libraries
, это утверждение должно обязательно работать.
Luk: просто проверить - можете ли вы запустить этот оператор в своей базе данных и сообщить, какой результат?
SELECT
tc.TABLE_NAME,
tc.CONSTRAINT_NAME,
ccu.COLUMN_NAME
FROM
INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
INNER JOIN
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu
ON ccu.TABLE_NAME = tc.TABLE_NAME AND ccu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
WHERE
tc.TABLE_NAME IN ('Libraries', 'Content')
Ответ 2
Обратите внимание, что поля должны быть в том же порядке. Если основной ключ, на который вы ссылаетесь, указан как (приложение, идентификатор), то ваш внешний ключ должен ссылаться (приложение, идентификатор) и NOT (идентификатор, приложение), поскольку они рассматриваются как два разных ключа.
Ответ 3
Таблица Content
может иметь несколько повторяющихся значений Application
, которые нельзя сопоставить с Libraries
. Можно ли отбросить столбец Application
из индекса основного ключа Libraries
и вместо него добавить его как индекс уникального ключа?
Ответ 4
У меня была такая же проблема, и я думаю, что у меня есть решение.
Если ваше поле Application
в таблице Library
имеет внешний ключ, который ссылается на поле в другой таблице (с именем Application
я бы поставил), то ваше поле Application
в таблице Library
должно иметь внешний ключ к таблице Application
тоже.
После этого вы можете сделать свой скомпонованный внешний ключ.
Извините мой бедный английский, и извините, если я ошибаюсь.
Ответ 5
Ключ "порядок столбца должен быть одинаковым"
Пример:
create Table A (
A_ID char(3) primary key,
A_name char(10) primary key,
A_desc desc char(50)
)
create Table B (
B_ID char(3) primary key,
B_A_ID char(3),
B_A_Name char(10),
constraint [Fk_B_01] foreign key (B_A_ID,B_A_Name) references A(A_ID,A_Name)
)
порядок столбцов на таблице A должен быть → A_ID
, затем A_Name
; определение внешнего ключа также должно соответствовать тому же порядку.