如何使用2个表指定约束

时间:2011-07-19 13:44:55

标签: mysql relational-database constraints

我有以下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所指向的行

2 个答案:

答案 0 :(得分:1)

执行此操作的正确方法是不要在CSC_ID中添加列BUBBLES_HOTELBUBBLES_HOTEL中的每一行都包含指向BUBBLES_REGION中某行的链接,该行又包含指向BUBBLES_CSC中某行的链接。这就是您如何识别BUBBLES_CSCBUBBLES_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获得它。