mysql - 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)
);
解决方案
主键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)
);
推荐阅读
- java - 在firebase android开发中通过循环从子节点中检索特定数据
- python - 如何修复 python 中的“ValueError:数学域错误”?
- python-3.x - for i in range(0,x+1) for j in range(0,y+1) for k in range(0,z+1) if((i+j+k))!=n print([[ i,j,k]])。这段代码有什么问题?
- css - 使用 CSS 或 TailwindCSS 在元素之间共享背景图像
- javascript - 当状态更改而没有突变时,Angular 会重新呈现组件列表
- python - Python函数不返回值
- sql - SQL将字符串连接为单个值
- c++ - static_cast int 引用 int?
- php - 在 Slim 中的路由之间传递数据
- mysql - 如何使用第三个表中的条件更新具有其他表中特定值的表