mysql - 外键约束错误 - MySQL

标签 mysql database

我正在尝试创建一个数据库,其中包含来自游戏的分配信息,但在创建带有分配主键和外键的表时遇到问题。任何帮助都会很棒。

我收到的错误代码是:#1215 - 无法在表 Boss 上添加外键约束。它很好地创建了第一个表它只是停止工作并在创建表 boss 时在外键处抛出错误。

在项目表中,Boss 字段需要能够为多个不同的项目输入相同的数据。

CREATE TABLE item ( ID SERIAL, Name VARCHAR(35), Boss VARCHAR(25), Type VARCHAR(20), Slot VARCHAR(20),  PRIMARY KEY (Name,Boss) );
CREATE TABLE boss ( ID SERIAL, Boss VARCHAR(25), Type VARCHAR(20), Location VARCHAR(20), Difficulty INT, PRIMARY KEY (ID, Location), FOREIGN KEY (Boss) REFERENCES item(Boss) );
CREATE TABLE dungeon ( ID SERIAL, Name VARCHAR(25), Location VARCHAR(20), Rating INT, PRIMARY KEY (Name), FOREIGN KEY (Location) REFERENCES boss(Location) );

最佳答案

我可以看到您的数据库创建脚本有很多问题,但我只会坚持那些会立即影响它首先开始工作的问题:

  1. 您应该始终通过主键而不是其他任何方式引用另一个表。

  2. 您的引用资料放在了错误的表格中。如果您想从“项目”中引用“老板”,那么您应该这样做,而不是从“老板”中引用“项目”。

  3. 但最重要的是引用应该与它们引用的主键属于同一类型。

  4. 当您真的不需要时,复合键不是一个好主意。

因此,一个工作脚本将是:

CREATE TABLE dungeon ( ID BIGINT(20), Name VARCHAR(25), Location VARCHAR(20), Rating INT, PRIMARY KEY (ID) );

CREATE TABLE boss ( ID BIGINT(20), Type VARCHAR(20), LocationId BIGINT(20), Difficulty INT, PRIMARY KEY (ID), FOREIGN KEY (LocationId) REFERENCES dungeon (ID) );

CREATE TABLE item ( ID BIGINT(20), Name VARCHAR(35), BossId BIGINT(20), Type VARCHAR(20), Slot VARCHAR(20),  PRIMARY KEY (ID), FOREIGN KEY (BossId) REFERENCES boss (ID) );

您可以根据需要进行调整,但在此之前,我建议您阅读一本关于数据库设计的好书,或者 - 至少 - 一本关于基本关系数据库原理的教程。

关于mysql - 外键约束错误 - MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41702943/

相关文章:

mysql - 使用联接时如何为 mysql 中的 avg 聚合函数选择不同的行?

python - MySQL VarChar 255 及以上

java - HIbernate自动删除旧数据

mysql - 我应该使用什么 MYSQL 数据类型来存储 64 位 double ?

mysql - 以某些语言将文本存储在数据库中

php - 用数据库制作动态页面?

mysql - 更新字段内连接

php - 如何使用ajax传递html代码块并将其保存到mysql

java - 我们应该在 Java Eclipse Dynamic Web 项目中的哪里存储数据库配置文件?

php - 在 MySQL DB 中存储 base64 编码值的最佳方式?