Внешний ключ ссылается на первичный ключ нескольких значений - PullRequest
1 голос
/ 07 марта 2019

Я использую MS SQL Server.Я получаю это сообщение, когда ссылаюсь на первичный ключ, который представляет собой составной ключ из 3 значений во внешнем ключе.

«количество ссылочных столбцов во внешнем ключе отличается от количества ссылочных столбцов».Проблема заключается во второй последней строке кода в бронировании участника.Есть идеи?Заранее спасибо.

CREATE TABLE room
(
Block CHAR (1),
Lvl INT,
rNum INT,
RmType VARCHAR (15),
Condition VARCHAR (15),
CONSTRAINT room_PK PRIMARY KEY (Block, Lvl, rNum),
)




CREATE TABLE booking
(
BookingID INT,
BStartDate DATE,
BEndDate DATE,
Fee DECIMAL (8,2) NOT NULL CHECK (fee >= 0),
Memberbooking INT NOT NULL,
MemberID INT NOT NULL,
CONSTRAINT booking_pk PRIMARY KEY (BookingID),
CONSTRAINT FK_Booking FOREIGN KEY (Memberbooking) references room (Block, Lvl, rNum),
CONSTRAINT FK_MemberID FOREIGN KEY (MemberID) references member (ID)
)

Ответы [ 4 ]

0 голосов
/ 07 марта 2019

На столе "комната" у вас есть составной натуральный ключ.Это правильное дизайнерское решение.Альтернативой может быть добавление искусственного идентификатора в один столбец, например int Identity.Это привело бы к двум ключам в одной таблице (один из них - Первичный ключ, другой - ограничение Уникальность).

В ограничении внешнего ключа вы можете ссылаться на любое ограничение Уникальности или Первичный ключ.Если вы хотите сохранить таблицу «room» такой, какая она есть, вам нужно отразить эти ключевые поля в ссылочной таблице.Это означает, что вашей таблице «бронирования» потребуются столбцы Block char (1), Lvl int и rNum int.

Именно поэтому искусственный ключ (в комнате) может быть полезен, потому что тогда ваш внешний ключограничение (при бронировании) может состоять из одного столбца и ссылаться на уникальный параметр.

0 голосов
/ 07 марта 2019

Вы получаете сообщение об ошибке, потому что вы пытаетесь сопоставить 1 столбец (FOREIGN KEY (Memberbooking)) с комнатой с 3 столбцами (Block, Lvl, rNum)

этоМожно создать отношение внешнего ключа к составному (более одного столбца) первичному ключу. Убедитесь, что в FOREIGN KEY указано одинаковое количество столбцов

0 голосов
/ 07 марта 2019

Поскольку я вижу из комментариев, что вы намерены реализовать этот тип проверки, я бы предложил ограничение проверки:

CONSTRAINT CK_MemberID CHECK (EXISTS(SELECT 1 FROM room where Memberbooking=room.Block+convert(nchar,room.Lvl)+convert(nchar,room.rNum)))

Однако этот дизайн не очень хорош.Отсутствие разделителей в поле Membermooking может привести к коллизиям.

Например, рассмотрим, есть ли у вас членство: 'A1101'

Это блок A, уровень 11, номер 01?Или это Блок А, Ур. 1, № 101?

0 голосов
/ 07 марта 2019

Вы определяете это ограничение в таблице booking:

CONSTRAINT FK_Booking FOREIGN KEY (Memberbooking) references room (Block, Lvl, rNum)

, означая, что вы хотите, чтобы столбец Memberbooking ссылался на 3 столбца (!!) в таблице room.Каждый столбец таблицы может ссылаться на один столбец из другой таблицы, а не на несколько.Вы можете определить один и тот же столбец для ссылки на более чем 1 столбец в другой таблице, но с другими ограничениями, и всегда от 1 до 1.Подробнее здесь: Создание отношений по внешнему ключу

...