我有以下 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_HOTEL中REGION_ID指向的行的BUBBLES_REGION中指定的CSC_ID相同
最佳答案
执行此操作的正确方法是根本不在 BUBBLES_HOTEL
中包含 CSC_ID
列。 BUBBLES_HOTEL
中的每一行都包含指向 BUBBLES_REGION
中行的链接,而 BUBBLES_REGION
中又包含指向 BUBBLES_CSC
中行的链接。这就是您如何识别 BUBBLES_HOTEL
中的给定行对应于 BUBBLES_CSC
中的哪一行。您当前的设计尚未标准化。
话虽如此,您可以通过将 BUBBLES_HOTEL
上的两个外键替换为一个来实现您的要求:
FOREIGN KEY (CSC_ID, REGION_ID) REFERENCES BUBBLES_REGION (CSC_ID, REGION_ID)
关于mysql - 如何用2个表指定约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6748138/