我试图在MySQL中创建三个链接表,但是我编写的脚本给了我Error code: 1005. Can't create table 'xxx.MagPage' (errno: 150)
。使用此错误代码检查其他线程已显示出,当两个链接的列具有不同的数据类型时,会发生此错误,但是所有外键与链接的列具有相同的类型。
这些只是示例表,但是使用与我的真实表相同的设置和数据类型。基本上,它是杂志的数据库。每本杂志都有唯一的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)
);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句