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

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

我正在创建两个 table,一个平台 table 和一个游戏 table,但我收到一条错误消息,说它无法在 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]

这是我创建 tables

的代码
 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)
); 

错误是因为在 game table.

中找不到 platformId 引用

注意几点:

  1. LONG数据类型是MEDIUMTEXT的别名,肯定不会有AUTO_INCREMENT吧?按原样使用时出现错误。
  2. 当您执行 FOREIGN KEY (platformId) 时,此部分引用 当前 table 中的一列,然后是其他 table 这列指的是:REFERENCES Platforms(platformId) 部分。
  3. 当前 table 中外键的 (column) 引用必须有索引。
  4. 了解外键的两个 table 中的列引用必须具有相同的数据类型,包括签名(如果指定),这一点很重要。 (例如,如果一列无符号,则其他列也需要无符号)

所以,了解这些事情,在下面的例子中:

  1. 我已将 table 中的 LONG 替换为 INT(11) unsigned
  2. game table
  3. 中为 platformId 添加了一列
  4. 也向 game table 中的 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)