Подтвердить что ты не робот

Внешний ключ, ссылающийся на первичный ключ 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])

Большое спасибо за вашу помощь!

4b9b3361

Ответ 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; определение внешнего ключа также должно соответствовать тому же порядку.