Создание отношения один ко многим с использованием SQL Server - PullRequest
49 голосов
/ 20 августа 2009

Как создать связь один ко многим с помощью SQL Server?

Ответы [ 5 ]

78 голосов
/ 20 августа 2009
  1. Определить две таблицы (примеры A и B) с их собственным первичным ключом
  2. Определить столбец в таблице A как имеющий отношение внешнего ключа на основе первичного ключа таблицы B

Это означает, что в таблице A может быть одна или несколько записей, относящихся к одной записи в таблице B.

Если у вас уже есть таблицы, используйте инструкцию ALTER TABLE, чтобы создать ограничение внешнего ключа:

ALTER TABLE A ADD CONSTRAINT fk_b FOREIGN KEY (b_id) references b(id) 
  • fk_b: имя ограничения внешнего ключа, должно быть уникальным для базы данных
  • b_id: имя столбца в таблице A, где вы создаете отношение внешнего ключа для
  • b: имя таблицы, в данном случае b
  • id: имя столбца в таблице B
59 голосов
/ 21 августа 2009

Это простой пример классического примера заказа. Каждый Клиент может иметь несколько Заказ с, и каждый Заказ может состоять из нескольких OrderLine с.

Вы создаете отношение, добавляя столбец внешний ключ . Каждая запись заказа содержит идентификатор клиента, который указывает на идентификатор клиента. Точно так же каждая OrderLine имеет значение OrderID. Вот так выглядит схема базы данных:

enter image description here

На этой диаграмме есть фактические ограничения внешнего ключа . Они не являются обязательными, но они обеспечивают целостность ваших данных. Кроме того, они делают структуру вашей базы данных более понятной для всех, кто ее использует.

Полагаю, вы знаете, как создавать таблицы самостоятельно. Тогда вам просто нужно определить отношения между ними. Конечно, вы можете определить ограничения в T-SQL (опубликованные несколькими людьми), но они также легко добавляются с помощью дизайнера. Используя SQL Management Studio, вы можете щелкнуть правой кнопкой мыши по таблице Order , щелкнуть по Design (я думаю, что это может называться Edit под 2005). Затем в любом месте окна, которое открывается правой кнопкой мыши, выберите Отношения .

.

Вы получите еще одно диалоговое окно, справа должен быть вид сетки. Одна из первых строк гласит: « Спецификация таблиц и столбцов ». Нажмите на эту строку, затем снова нажмите на маленькую кнопку [...], которая появляется справа. Вы получите этот диалог:

Foreign key constraint

Таблица Order уже должна быть выбрана справа. Выберите таблицу Customer в раскрывающемся списке слева. Затем в левой сетке выберите столбец ID. В правой сетке выберите столбец CustomerID. Закройте диалог, и следующий. Нажмите Ctrl + S , чтобы сохранить.

Наличие этого ограничения гарантирует, что никакие записи Заказа не могут существовать без сопровождающей записи Клиента.

Для эффективного запроса к базе данных, подобной этой, вы можете прочитать о JOIN .

3 голосов
/ 20 августа 2009

Вот как я обычно это делаю (сервер sql).

Create Table Master (
MasterID int identity(1,1) primary key,
Stuff varchar(10)
)
GO
Create Table Detail (
DetailID int identity(1,1) primary key,
MasterID int references Master, --use 'references'
Stuff varchar(10))
GO
Insert into Master values('value')
--(1 row(s) affected)
GO
Insert into Detail values (1, 'Value1') -- Works
--(1 row(s) affected)
insert into Detail values (2, 'Value2') -- Fails
--Msg 547, Level 16, State 0, Line 2
--The INSERT statement conflicted with the FOREIGN KEY constraint "FK__Detail__MasterID__0C70CFB4". 
--The conflict occurred in database "Play", table "dbo.Master", column 'MasterID'.
--The statement has been terminated.

Как видите, вторая вставка в детали не выполняется из-за внешнего ключа. Вот хорошая веб-ссылка, которая показывает различный синтаксис для определения FK во время создания таблицы или после нее.

http://www.1keydata.com/sql/sql-foreign-key.html

1 голос
/ 20 августа 2009

Если вы не используете SSMS, то вот синтаксис:

ALTER TABLE <table_name>
ADD <constraint_name> FOREIGN KEY 
(<column_name1> ,
<column_name2> )
REFERENCES <table_name>
(<column_name1> ,
<column_name2>)

http://infogoal.com/sql/sql-add-foreignkey.htm

1 голос
/ 20 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...