gpt4 book ai didi

MySQL 错误代码 1005,尽管数据类型相同

转载 作者:行者123 更新时间:2023-11-29 15:30:12 24 4
gpt4 key购买 nike

我试图在 MySQL 中创建三个链接表,但我编写的脚本给出了错误代码:1005。无法创建表“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)
);

最佳答案

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)
);

关于MySQL 错误代码 1005,尽管数据类型相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58789036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com