簡體   English   中英

為什么在我嘗試創建外鍵時會出現錯誤提示該列不存在

[英]Why does it come up with an error that says that the column doesnt exist when I try and create foreign keys

我對 mysql 和編寫查詢比較陌生。 我正在嘗試創建一個具有多種不同關系的數據庫。 我能夠創建表並分配唯一索引,但是當我嘗試更改每個表時,我會收到相同的錯誤,具體取決於我嘗試創建的外鍵。 這是我得到的錯誤:

在此處輸入圖像描述

錯誤代碼:1072。表中不存在鍵列“gameID”

這是我嘗試打電話的時候

ALTER TABLE `tbl_player` ADD FOREIGN KEY (`gameID`) REFERENCES tbl_game(`gameID`);

以下是當前的 SQL 腳本:

drop database if exists test_DB;
create database test_DB;
use test_DB;

drop procedure if exists createdb;  
delimiter //
create procedure createdb()
begin

/*Leaderboard*/
drop table if exists tbl_leaderboard;   
CREATE TABLE `tbl_leaderboard` (
    `leaderboardID` INTEGER NOT NULL,
    `totalScore` INTEGER DEFAULT 0 NOT NULL,
    `gamesPlayed` INTEGER DEFAULT 0 NOT NULL,
    `averageScore` INTEGER DEFAULT 0 NOT NULL,
    CONSTRAINT SYS_PK_10503 PRIMARY KEY (`leaderboardID`)
);

/*User ===================================================================================*/ 
drop table if exists tbl_user; 
CREATE TABLE `tbl_user` (
    `userID` INTEGER NOT NULL,
    `username` VARCHAR(255) NOT NULL,
    `user_password` VARCHAR(20) NOT NULL,
    `user_email` VARCHAR(20) NOT NULL,
    `user_loginAttermpts` INTEGER DEFAULT 0 NOT NULL,
    `user_accountStatus` INTEGER DEFAULT 0 NOT NULL,
    `user_isAdmin` BOOLEAN NOT NULL,
    CONSTRAINT SYS_PK_10513 PRIMARY KEY (`userID`,`username`)
);

/*Player  ===================================================================================*/
drop table if exists tbl_player; 
CREATE TABLE `tbl_player` (
    `player_score` SMALLINT DEFAULT 0 NOT NULL,
    `playerID` SMALLINT NOT NULL,
    `colour` VARCHAR(20) NOT NULL,
    CONSTRAINT SYS_PK_10375 PRIMARY KEY (`player_score`,`playerID`)
);

/*Inventory ===================================================================================*/
drop table if exists tbl_inventory;
CREATE TABLE `tbl_inventory` (
    `inventoryID` INTEGER NOT NULL,
    `quantity` INTEGER DEFAULT 0 NOT NULL,
    CONSTRAINT SYS_PK_10520 PRIMARY KEY (`inventoryID`)
);

/*Tile ===================================================================================*/
drop table if exists tbl_tile;
CREATE TABLE `tbl_tile` (
    `tileID` INTEGER NOT NULL,
    CONSTRAINT SYS_PK_10547 PRIMARY KEY (`tileID`)
    
);

/*Board ===================================================================================*/
drop table if exists tbl_board;
CREATE TABLE `tbl_board` (
    `boardID` INTEGER NOT NULL,
    CONSTRAINT SYS_PK_10538 PRIMARY KEY (`boardID`)
    
);

/*Game ===================================================================================*/
drop table if exists tbl_game;
CREATE TABLE `tbl_game` (
    `gameID` INTEGER NOT NULL,
    `gameNumber` INTEGER DEFAULT 0 NOT NULL,
    `numberOfPlayers` INTEGER DEFAULT 0 NOT NULL,
    `gameMode` VARCHAR(30) NOT NULL,
    CONSTRAINT SYS_PK_10543 PRIMARY KEY (`gameID`)
);

/*Chat ===================================================================================*/
drop table if exists tbl_gameChat;
CREATE TABLE `tbl_gameChat` (
    `chatID` SMALLINT NOT NULL,
    `text` VARCHAR(255),
    CONSTRAINT SYS_PK_10555 PRIMARY KEY (`chatID`)
);

/*TileAsset ===================================================================================*/
drop table if exists tbl_assetTile;
CREATE TABLE `tbl_assetTile` (
    `assetTileID` INTEGER NOT NULL,
    CONSTRAINT SYS_PK_10545 PRIMARY KEY (`assetTileID`)
);

/*Asset ===================================================================================*/
drop table if exists tbl_asset;
CREATE TABLE `tbl_asset` (
    `assetID` INTEGER NOT NULL,
    `asset_name` VARCHAR(50) NOT NULL,
    `asset_type` VARCHAR(50) NOT NULL,
    `asset_value` INTEGER DEFAULT 0 NOT NULL,
    CONSTRAINT SYS_PK_10557 PRIMARY KEY (`assetID`)
);

/*Create UNIQUE Indexes*/
    CREATE UNIQUE INDEX SYS_IDX_SYS_PK_10503_10504 ON `tbl_leaderboard` (`leaderboardID`);
    
    CREATE UNIQUE INDEX SYS_IDX_SYS_PK_10497_10498 ON `tbl_user` (`userID`,`username`);
    CREATE UNIQUE INDEX SYS_IDX_SYS_PK_10513_10514 ON `tbl_user` (`userID`,`username`);
    
    CREATE UNIQUE INDEX SYS_IDX_SYS_PK_10375_10376 ON `tbl_player` (`player_score`,`playerID`);
    
    CREATE UNIQUE INDEX SYS_IDX_SYS_PK_10520_10521 ON `tbl_inventory` (`inventoryID`);
    
    CREATE UNIQUE INDEX SYS_IDX_SYS_PK_10547_10548 ON `tbl_tile` (`tileID`);
    
    CREATE UNIQUE INDEX SYS_IDX_SYS_PK_10538_10539 ON `tbl_board` (`boardID`);
    
    CREATE UNIQUE INDEX SYS_IDX_SYS_PK_10543_10544 ON `tbl_game` (`gameID`);
    
    CREATE UNIQUE INDEX SYS_IDX_SYS_PK_10555_10556 ON `tbl_gameChat` (`chatID`);
    
    CREATE UNIQUE INDEX SYS_IDX_SYS_PK_10545_10546 ON `tbl_assetTile` (`assetTileID`);
    
    CREATE UNIQUE INDEX SYS_IDX_SYS_PK_10557_10558 ON `tbl_asset` (`assetID`);


/*Add Foreign Keys*/
    ALTER TABLE `tbl_player` ADD FOREIGN KEY (`gameID`) REFERENCES tbl_game(`gameID`);
    ALTER TABLE `tbl_player` ADD FOREIGN KEY (`tileID`) REFERENCES tbl_tile(`tileID`);
    ALTER TABLE `tbl_player` ADD FOREIGN KEY (`userID`) REFERENCES tbl_user(`userID`);
    
    ALTER TABLE `tbl_inventory` ADD FOREIGN KEY (`playerID`) REFERENCES tbl_player(`playerID`);
    ALTER TABLE `tbl_inventory` ADD FOREIGN KEY (`assetID`) REFERENCES tbl_asset(`assetID`);
    
    ALTER TABLE `tbl_tile` ADD FOREIGN KEY (`boardID`) REFERENCES tbl_board(`boardID`);
    
    ALTER TABLE `tbl_board` ADD FOREIGN KEY (`gameID`) REFERENCES tbl_game(`gameID`);
    
    ALTER TABLE `tbl_gameChat` ADD FOREIGN KEY (`gameID`) REFERENCES tbl_game(`gameID`);
    
    ALTER TABLE `tbl_assetTile` ADD FOREIGN KEY (`tileID`) REFERENCES tbl_tile(`tileID`);
    ALTER TABLE `tbl_assetTile` ADD FOREIGN KEY (`assetID`) REFERENCES tbl_asset(`assetID`);

    ALTER TABLE `tbl_leaderboard` ADD FOREIGN KEY (`player_score`) REFERENCES tbl_player(`player_score`);
    ALTER TABLE `tbl_leaderboard` ADD FOREIGN KEY (`userID`) REFERENCES tbl_user(`userID`);
    ALTER TABLE `tbl_leaderboard` ADD FOREIGN KEY (`username`) REFERENCES tbl_user(`username`);

    
end //

delimiter ;
call createdb();

任何有關如何解決此問題的建議將不勝感激,並可能對格式進行改進。

您的表tbl_player沒有列gameID在您創建腳本中添加它以添加FOREIGN KEY ,這同樣適用於您嘗試添加的所有外鍵。 該列必須在您願意創建FOREIGN KEY的表中可用

CREATE TABLE `tbl_player` (
    `player_score` SMALLINT DEFAULT 0 NOT NULL,
    `playerID` SMALLINT NOT NULL,
    `colour` VARCHAR(20) NOT NULL,
    `gameID` INTEGER,
    CONSTRAINT SYS_PK_10375 PRIMARY KEY (`player_score`,`playerID`)
);

在為任何表創建外鍵之前,請確保該表包含/具有您要添加外鍵約束的列。

在您的情況下,如果您看到表tbl_player (正如您所共享的)

/*Player  ===================================================================================*/
drop table if exists tbl_player; 
CREATE TABLE `tbl_player` (
    `player_score` SMALLINT DEFAULT 0 NOT NULL,
    `playerID` SMALLINT NOT NULL,
    `colour` VARCHAR(20) NOT NULL,
    CONSTRAINT SYS_PK_10375 PRIMARY KEY (`player_score`,`playerID`)
);

沒有列gameID並且您正在運行的查詢ALTER TABLE `tbl_player` ADD FOREIGN KEY (`gameID`) REFERENCES tbl_game(`gameID`); 正在嘗試在gameIDtbl_player表中不存在)上添加外鍵約束,從而導致您提到的Error Code: 1072. Key column 'gameID' doesn't exist in table

要解決此問題,您可以:

  1. 更改表以添加新列,然后向該列添加外鍵約束:
ALTER TABLE tbl_player
  ADD COLUMN gameID INT,
  ADD FOREIGN KEY fk_name(gameID) REFERENCES tbl_game(gameID) ON DELETE CASCADE;
  1. 在創建表時添加一列gameID ,如下所示:
/*Player  ===================================================================================*/
drop table if exists tbl_player; 
CREATE TABLE `tbl_player` (
    `player_score` SMALLINT DEFAULT 0 NOT NULL,
    `playerID` SMALLINT NOT NULL,
    `colour` VARCHAR(20) NOT NULL,
    `gameID` INTEGER NOT NULL,
    CONSTRAINT SYS_PK_10375 PRIMARY KEY (`player_score`,`playerID`)
);

然后更改表以創建列gameID作為外鍵:

ALTER TABLE tbl_player add FOREIGN KEY(gameID) REFERENCES tbl_game(gameID);

以上任何一點都應該有效。

干杯!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM