2015-09-07 3 views
3

У меня есть три таблицы в моей базе данных.Ссылка на один внешний ключ на несколько первичных ключей в SQL Server 2014

  1. MedicalTest [MedicalTestID ПК]
  2. SportTest [SportTestID ПК]
  3. GeneralNeeds [GeneralNeedsID ПК]

enter image description here

Внутри GeneralNeeds есть ProcessID, которому необходимо сохранить MedicalTestID и SportTestID GUID.

Как только я вставляю существующий идентификатор GUID из обеих таблиц, я получаю сообщение об ошибке «Conflict», которое, я считаю, означает, что данный GUID не существует в другой таблице.

Например: если я вставляю идентификатор GUID из MedicalTest, тогда он скажет мне, что SportTest не имеет данного GUID.

enter image description here

Можно ли ссылаться на несколько ключей для одного столбца?

enter image description here

+0

'GUID'? Это может быть первичный ключ? – HelloNewWorld

+0

Можете ли вы дать полное сообщение об ошибке?Кроме того, какую таблицу вы вставляете, когда получаете сообщение? –

+0

Вам нужно будет удалить отношение внешнего ключа. Плохая идея сделать это, хотя и противоречит тому, как вы должны использовать внешние ключи. – dman2306

ответ

3

дизайн я бы рекомендовал здесь решение стол/суб-таблицы. Что это значит, введите 4-й стол, Test. Таблица Test просто служит таблицей, которая связывает все разные типы тестов вместе. Если вы знакомы с объектно-ориентированным программированием, подумайте об этом как о базовом типе. Таким образом, ваш ProcessID указывает на Test, который затем указывает на один из конкретных типов тестов (SportsTest, MedicalTest, WhateverTest). Если вам нравится, вы также можете указать Type в таблице Test, чтобы узнать, какой тип теста он есть. Здесь есть ключевая вещь: в таблице MedicalTest и SportsTest первичный ключ (скажем MedicalTestID) также является внешним ключом, который указывает на TestID в Test. Таким образом, вы можете использовать один столбец в своем GeneralNeeds, потому что ссылка относится к одному типу таблицы, Test. Начиная с Test, и соответствующий MedicalTest или SportsTest будет иметь тот же первичный ключ, вы можете легко выполнить соединения, необходимые для выполнения запроса.

Вот диаграмма, пример, иллюстрирующий это: DB Diagram

Простой пример: Скажем, у вас есть MedicalTest с ID 1 (давайте забудем GUIDs на минуту, чтобы сделать его легче читать) Тогда вы также имеют запись в Test с идентификатором 1. Тогда ProcessID из 1 действительно указывает на запись Test, которую вы могли бы затем присоединиться к записи MedicalTest.

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

+0

Большое вам спасибо за все это. Итак, я понимаю, что таблица «Test» со своим TestID будет подключена к моим различным тестам, и тогда же TestID будет подключен к ProcessID, правильно? –

+0

Точно! Единственный улов - вам нужно быть осторожным, что всякий раз, когда вы создаете «Тест», вы также создаете запись в соответствующей другой тестовой таблице для определенного типа. То же самое при удалении. Для удаления вы можете рассмотреть возможность включения 'CASCADE DELETE' и всегда удалить из' Test' и позволить SQL Server автоматически удалять подтип. – dman2306

+0

В основном TestID будет действовать как посредник. –

Смежные вопросы