我正在创建两个表,在其中一个表中,我试图分配一个外键,但它给了我一个错误
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
引用
注意几点:
LONG
数据类型是MEDIUMTEXT
的别名,肯定不会有AUTO_INCREMENT
吧?按原样使用时出现错误。
- 当您执行
FOREIGN KEY (platformId)
时,此部分引用 当前 table 中的一列,然后是其他 table 这列指的是:REFERENCES Platforms(platformId)
部分。
- 当前 table 中外键的
(column)
引用必须有索引。
- 了解外键的两个 table 中的列引用必须具有相同的数据类型,包括签名(如果指定),这一点很重要。 (例如,如果一列无符号,则其他列也需要无符号)
所以,了解这些事情,在下面的例子中:
- 我已将 table 中的
LONG
替换为 INT(11) unsigned
。
- 在
game
table 中为 platformId
添加了一列
- 也向
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)
我正在创建两个 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
引用
注意几点:
LONG
数据类型是MEDIUMTEXT
的别名,肯定不会有AUTO_INCREMENT
吧?按原样使用时出现错误。- 当您执行
FOREIGN KEY (platformId)
时,此部分引用 当前 table 中的一列,然后是其他 table 这列指的是:REFERENCES Platforms(platformId)
部分。 - 当前 table 中外键的
(column)
引用必须有索引。 - 了解外键的两个 table 中的列引用必须具有相同的数据类型,包括签名(如果指定),这一点很重要。 (例如,如果一列无符号,则其他列也需要无符号)
所以,了解这些事情,在下面的例子中:
- 我已将 table 中的
LONG
替换为INT(11) unsigned
。 - 在
game
table 中为 - 也向
game
table 中的platformId
列添加索引。
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)