我正在创建两个表,在其中一个表中我试图分配一个外键,但它给了我一个错误

Posted

技术标签:

【中文标题】我正在创建两个表,在其中一个表中我试图分配一个外键,但它给了我一个错误【英文标题】:I am Creating two tables and in one of the tables I am trying to assign a foreign key but it is giving me an error 【发布时间】:2021-11-28 19:15:23 【问题描述】:

我正在创建两个表,一个平台表和一个游戏表,我收到一条错误消息,说它在 sql 语句中找不到 PLATFORMID,但我不明白为什么

Column "PLATFORMID" not found; SQL statement: CREATE TABLE game( gameId LONG PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255), publisher VARCHAR(255), platform VARCHAR(255), price DECIMAL(4,2), FOREIGN KEY (platformId) REFERENCES Platforms(platformId) ) [42122-200]

这是我创建表格的代码

 CREATE TABLE Platforms(
     platformId LONG PRIMARY KEY AUTO_INCREMENT,
     platformName VARCHAR(255)
);

CREATE TABLE game(
    gameId LONG PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255), publisher VARCHAR(255), platform VARCHAR(255), price DECIMAL(4,2),
         FOREIGN KEY (platformId) REFERENCES Platforms(platformId)
); 

【问题讨论】:

您尚未在引用表中声明 platformid 列。 PS 对于编译器错误,请尽可能减少代码,直到确定并添加回来。阅读语法和手册。显示组成子表达式是可以的。 minimal reproducible example 【参考方案1】:

错误是因为在game 表中找不到platformId 引用。

需要注意的几点:

    LONG 数据类型是MEDIUMTEXT 的别名,肯定不会有AUTO_INCREMENT?我在按原样使用时遇到错误。 当您执行FOREIGN KEY (platformId) 时,此部分引用当前表 中的列,然后该列引用的另一个表是:REFERENCES Platforms(platformId) 部分。 当前表中外键的(column)引用必须有索引。 了解两个表中外键的列引用必须具有相同的数据类型,包括签名(如果指定),这一点至关重要。 (例如,如果一列有无符号,那么另一列也需要无符号)

所以,知道这些事情,在下面的例子中:

    我已将两个表中的 LONG 替换为 INT(11) unsigned。 在game 表中为platformId 添加了一列 同时为game 表中的platformId 列添加索引。

将所有这些放在一起,这是一个示例交互:

root@localhost((none)) use test2;
Database changed

root@localhost(test2) show tables;
Empty set (0.00 sec)

root@localhost(test2) CREATE TABLE Platforms(
    ->      platformId INT(11) unsigned PRIMARY KEY AUTO_INCREMENT,
    ->      platformName VARCHAR(255)
    -> );
Query OK, 0 rows affected (0.21 sec)

root@localhost(test2) CREATE TABLE game(
    ->     gameId INT(11) unsigned PRIMARY KEY AUTO_INCREMENT,
    ->     name VARCHAR(255),
    ->     publisher VARCHAR(255),
    ->     platform VARCHAR(255),
    ->     platformId INT(11) unsigned,
    ->     price DECIMAL(4,2),
    ->     index(platformid),
    ->     FOREIGN KEY (platformId) REFERENCES Platforms(platformId)
    -> );
Query OK, 0 rows affected (0.24 sec)

root@localhost(test2) show tables;
+-----------------+
| Tables_in_test2 |
+-----------------+
| game            |
| platforms       |
+-----------------+
2 rows in set (0.00 sec)

root@localhost(test2) show create table game \G
*************************** 1. row ***************************
       Table: game
Create Table: CREATE TABLE `game` (
  `gameId` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `publisher` varchar(255) DEFAULT NULL,
  `platform` varchar(255) DEFAULT NULL,
  `platformId` int(11) unsigned DEFAULT NULL,
  `price` decimal(4,2) DEFAULT NULL,
  PRIMARY KEY (`gameId`),
  KEY `platformId` (`platformId`),
  CONSTRAINT `game_ibfk_1` FOREIGN KEY (`platformId`) REFERENCES `platforms` (`platformId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

【讨论】:

感谢您进行如此多的解释并告诉我哪里出错了。这意味着很多:)

以上是关于我正在创建两个表,在其中一个表中我试图分配一个外键,但它给了我一个错误的主要内容,如果未能解决你的问题,请参考以下文章

Laravel中从一个表到另一个表中的同一字段的多个外键

连接同一个表中的两个外键引用同一个主键

使用NHibernate从外键获取MySQL表中的数据

Symfony:通过控制器更新外键的教义

MySQL中如何在关联表中查询出其中一个外键不存在的数据?

2个外键1个创建刀片