外键和 MySQL 错误

Posted

技术标签:

【中文标题】外键和 MySQL 错误【英文标题】:Foreign Keys and MySQL Errors 【发布时间】:2010-12-21 07:50:07 【问题描述】:

我有以下脚本在 mysql 5.1 版中创建一个表,以引用其他 3 个表。所有 3 个表都是使用 InnoDB 创建的,所有 3 个表的 ID 列都定义为 INT。

我已经成功创建了引用 ACCOUNT 和 PERSON 的其他表,但是,这是第一个引用 ADDRESS 的表,所以我在下面也包含了该表的定义,如运行。

我得到的错误是带有 errno 150 的 ERROR 1005 (HY000),据我所知,这与外键创建有关。

失败的脚本是(为简单起见删除了额外的列):

CREATE TABLE WORK_ORDER (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ACCOUNT_ID INT NOT NULL,
    CUSTOMER_ID INT NOT NULL,
    SALES_ID INT,
    TRADES_ID INT,
    LOCATION_ID INT NOT NULL,
    INDEX CUST_INDEX(CUSTOMER_ID),
    INDEX SALES_INDEX(SALES_ID),
    INDEX TRADES_INDEX(TRADES_ID),
    INDEX ACCOUNT_INDEX(ACCOUNT_ID),
    INDEX LOCATION_INDEX(LOCATION_ID),
    FOREIGN KEY (CUSTOMER_ID) REFERENCES PERSON(ID) ON DELETE CASCADE,
    FOREIGN KEY (SALES_ID) REFERENCES PERSON(ID) ON DELETE SET NULL,
    FOREIGN KEY (TRADES_ID) REFERENCES PERSON(ID) ON DELETE SET NULL,
    FOREIGN KEY (ACCOUNT_ID) REFERENCES ACCOUNT(ID) ON DELETE CASCADE,
    FOREIGN KEY (LOCATION_ID) REFERENCES ADDRESS(ID) ON DELETE SET NULL
) ENGINE=InnoDB;

用于创建 ADDRESS 表的 SQL 语句如下(为简单起见,删除了额外的列)。

CREATE TABLE ADDRESS (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    PERSON_ID INT NOT NULL,
    ACCOUNT_ID INT NOT NULL,
    ADDRESS_L1 VARCHAR(50),
    ADDRESS_L2 VARCHAR(50),
    CITY VARCHAR(25),
    PROVINCE VARCHAR(20),
    POSTAL_CODE VARCHAR(6),
    COUNTRY VARCHAR(25),
    INDEX CUST_INDEX(PERSON_ID),
    INDEX ACCOUNT_INDEX(ACCOUNT_ID),
    FOREIGN KEY (ACCOUNT_ID) REFERENCES ACCOUNT(ID) ON DELETE CASCADE,
    FOREIGN KEY (PERSON_ID) REFERENCES PERSON(ID) ON DELETE CASCADE
) ENGINE=InnoDB;

我在这里浏览了几个处理类似问题的问题,但大多数似乎是重复的定义和不匹配的字段类型,以及一些没有将 InnoDB 用于其中一个或另一个表。然而,这些似乎都不是问题。有什么想法吗?

【问题讨论】:

您对 LOCATION_ID 键的 DELETE 操作看起来不太正确,因为 LOCATION_ID 被定义为 NOT NULL。我不认为mysql在约束创建期间检查过这个,虽然...... 谢谢,成功了!将其发布为答案,我会将其标记为正确。 【参考方案1】:

您始终可以发出“SHOW ENGINE INNODB STATUS”命令。隐藏在输出中的是“LATEST FOREIGN KEY ERROR”部分,其中将详细说明导致“150”错误的确切原因:

mysql> create table a (x int not null) type=innodb;
Query OK, 0 rows affected, 1 warning (0.02 sec)

mysql> create table b (y int not null, foreign key (y) references a (x) on delete set null) type=innodb;
ERROR 1005 (HY000): Can't create table './test/b.frm' (errno: 150)

mysql> show engine innodb status;
[..... snip snip snip ...]
------------------------
LATEST FOREIGN KEY ERROR
------------------------
091129 16:32:41 Error in foreign key constraint of table test/b:
foreign key (y) references a (x) on delete set null) type=innodb:
You have defined a SET NULL condition though some of the
columns are defined as NOT NULL.
[.... snip snip snip ...]

【讨论】:

酷,每天都学点新东西(我想这意味着我可以在接下来的一天中摆脱困境)。

以上是关于外键和 MySQL 错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 mysql 学习带有外键和一对多关系关系的 Spring Boot 但是

在复合键和外键之间创建关系

mysql添加外键失败

删除具有外键的列

同一个表的两个外键和多个JOIN与WHERE子句

mysql外键名重复的问题。