我有以下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;
现在我知道如何做一个外键,但是如何指定BUBBLES_HOTEL中的CSC_ID应该与BUBBLES_HEGION中指定的CSC_ID相同,以及BUBBLES_HOTEL中REGION_ID所指向的行
答案 0 :(得分:1)
执行此操作的正确方法是不要在CSC_ID
中添加列BUBBLES_HOTEL
。 BUBBLES_HOTEL
中的每一行都包含指向BUBBLES_REGION
中某行的链接,该行又包含指向BUBBLES_CSC
中某行的链接。这就是您如何识别BUBBLES_CSC
中BUBBLES_HOTEL
中给定行的BUBBLES_HOTEL
对应的行。您当前的设计未正常化。
话虽如此,你可以通过用{1}替换FOREIGN KEY (CSC_ID, REGION_ID) REFERENCES BUBBLES_REGION (CSC_ID, REGION_ID)
上的两个外键来实现你的要求:
{{1}}
答案 1 :(得分:1)
我假设所有三个关系都创建了一对一的链。如果是这样,你不应该在BUBBLES_HOTEL中有CSC_ID列,这是多余的:你总是可以通过BUBBLES_REGION获得它。