首页 > 解决方案 > MySQL 错误代码 1005,尽管数据类型相同

问题描述

我正在尝试在 MySQL 中创建三个链接表,但我编写的脚本给了我Error code: 1005. Can't create table 'xxx.MagPage' (errno: 150)。使用此错误代码检查其他线程向我表明,当两个链接列具有不同的数据类型时,可能会发生此错误,但是所有外键都具有与链接列相同的类型。

这些只是示例表,但使用与我的真实表相同的设置和数据类型。基本上,它是一个杂志数据库。每本杂志都有一个唯一的 ID,并且有问题。这些问题可以通过它们的杂志 ID 和它们的期号来唯一标识(多个杂志可以具有相同的期号)。杂志的每一页都有一个编号,并由其杂志 ID、期号和页码的组合来唯一标识。(多本杂志的页码可以是 4,多期杂志的页码可以是 4)。

CREATE TABLE Magazine(
    id CHAR(14) UNIQUE NOT NULL,
    PRIMARY KEY(id)
);

CREATE TABLE MagIssue(
    mag_id CHAR(14) NOT NULL,
    issue_num INTEGER NOT NULL,
    PRIMARY KEY(mag_id, issue_num),
    FOREIGN KEY(mag_id) REFERENCES Magazine(id),
    CONSTRAINT U_Issue UNIQUE (mag_id, issue_num)
);

CREATE TABLE MagPage(
    mag_id CHAR(14) NOT NULL,
    issue_num INTEGER NOT NULL,
    page_num INTEGER NOT NULL,
    PRIMARY KEY(mag_id, issue_num, page_num),
    FOREIGN KEY(mag_id) REFERENCES Magazine(id),
    FOREIGN KEY(issue_num) REFERENCES MagIssue(issue_num),
    CONSTRAINT U_Page UNIQUE (mag_id, issue_num, page_num)
);

标签: mysqlsql

解决方案


主键MagIssue有两部分。您需要同时参考:

FOREIGN KEY (mag_id, issue_num) REFERENCES MagIssue(mag_id issue_num),

我不喜欢复合主键。您还在多个表中重复引用。并且对于索引,整数往往比字符串更好(边缘优化)。

我会建议:

CREATE TABLE Magazines (
    mag_id INT AUTO_INCREMENT PRIMARY KEY,
    mag_key CHAR(14) UNIQUE NOT NULL
);

CREATE TABLE MagIssues (
    magissues_id INT AUTO_INCREMENT PRIMARY KEY,
    mag_id INT NOT NULL,
    issue_num INT NOT NULL,
    UNIQUE (mag_id, issue_num),
    FOREIGN KEY(mag_id) REFERENCES Magazine (mag_id)
);

CREATE TABLE MagPages (
    magpages_id INT AUTO_INCREMENT PRIMARY KEY,
    magissues_id INT NULL NULL,
    issue_num INTEGER NOT NULL,
    page_num INTEGER NOT NULL,
    FOREIGN KEY(magissues_id) REFERENCES MagIssues (magissues_id),
    CONSTRAINT U_Page UNIQUE (magissues_id, issue_num, page_num)
);

推荐阅读