mysql - 如何用2个表指定约束

标签 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_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/

相关文章:

mysql - 选择多对多关系中所有唯一的可能(多个)值?

php - 尝试开发一个搜索引擎,我的代码有错误

mysql - SQL 按主键计数分组

mysql - 在这种情况下如何使用外键?

mysql - SQL-DBDL 如何约束父类(super class)参与子类?

sql - PostgreSQL 外键语法

mysql - 在用户表中查找 id

mysql - 如何使我的 SQL 内部联接绕过表?

postgresql - 如何使用触发器来防止 PostgreSQL 中的重复记录?

java - 将约束添加到仅包含 Java 列表中的第一个对象的字段