Как указать ограничение с 2 таблицами - PullRequest
0 голосов
/ 19 июля 2011

У меня есть следующие 3 таблицы

CREATE TABLE BUBBLES_CSC (
CSC_ID integer UNSIGNED NOT NULL AUTO_INCREMENT,
COUNTRY_NAME varchar(255) NOT NULL,
STATE_NAME varchar(255) NOT NULL,
CITY_NAME varchar(255) NOT NULL,
PRIMARY KEY(CSC_ID,STATE_NAME,CITY_NAME),
INDEX(CSC_ID ,CITY_NAME,COUNTRY_NAME )
);

CREATE TABLE BUBBLES_REGION (
REGION_ID integer UNSIGNED NOT NULL AUTO_INCREMENT,
REGION_NAME varchar(255) NOT NULL,
CSC_ID integer UNSIGNED NOT NULL,
PRIMARY KEY(REGION_ID),
FOREIGN KEY (CSC_ID) REFERENCES BUBBLES_CSC(CSC_ID) ON UPDATE CASCADE ON DELETE CASCADE,
INDEX(REGION_ID ,REGION_NAME ,CSC_ID )
);

CREATE TABLE BUBBLES_HOTEL (
HOTEL_ID integer UNSIGNED NOT NULL AUTO_INCREMENT,
NAME varchar(255) NOT NULL,
DESCRIPTION varchar(255) DEFAULT "No description",
CSC_ID integer UNSIGNED NOT NULL,
REGION_ID integer UNSIGNED NOT NULL,
STREET_ADDRESS varchar(255) DEFAULT NULL,
PRIMARY KEY(HOTEL_ID),
FOREIGN KEY (CSC_ID) REFERENCES BUBBLES_CSC(CSC_ID) ON UPDATE CASCADE,
FOREIGN KEY (REGION_ID) REFERENCES BUBBLES_REGION(REGION_ID) ON UPDATE CASCADE,
INDEX(HOTEL_ID,NAME,CSC_ID,REGION_ID)
)CHARACTER SET=utf8;

Теперь я знаю, как сделать внешний ключ, но как указать, что CSC_ID в BUBBLES_HOTEL должен совпадать с CSC_ID, указанным в BUBBLES_REGION для строки, на которую указывает REGION_ID в BUBBLES_HOTEL

Ответы [ 2 ]

1 голос
/ 19 июля 2011

Я предполагаю, что все три отношения создают цепочку один-к-одному.Если это так, у вас не должно быть столбца CSC_ID в BUBBLES_HOTEL, он избыточен: вы всегда можете получить его через BUBBLES_REGION.

1 голос
/ 19 июля 2011

Правильный способ сделать это - вообще не иметь столбец CSC_ID в BUBBLES_HOTEL.Каждая строка в BUBBLES_HOTEL содержит ссылку на строку в BUBBLES_REGION, которая, в свою очередь, содержит ссылку на строку в BUBBLES_CSC.Вот как вы определяете, какой строке в BUBBLES_CSC соответствует данная строка в BUBBLES_HOTEL.Ваш текущий дизайн не нормализован.

Сказав это, вы можете достичь того, что просите, заменив два внешних ключа на BUBBLES_HOTEL только одним:

FOREIGN KEY (CSC_ID, REGION_ID) REFERENCES BUBBLES_REGION (CSC_ID, REGION_ID)
...