2013-03-23 118 views
1

剛剛完成爲遊戲即時建築設置數據庫的過程。遊戲庫存數據庫外鍵

它有3個表:

USER_TABLE

USER_ID - PK

用戶名

密碼

電子郵件

水平

位置

user_inventory

user_inventory_id - PK

USER_ID - FK

game_item_id - FK

game_items

game_item_id - PK

ITEM_NAME

現在

在我的註冊腳本我簡單的記錄插入USER_TABLE保存的用戶名,電子郵件地址和密碼,但因爲我提出的其他兩個表,並取得了USER_ID和game_item_id外鍵在user_inventory表我正在recieving此錯誤:

'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (sik_game_db . user_table , CONSTRAINT user_table_ibfk_1 FOREIGN KEY (user_id) REFERENCES user_inventory (user_inventory_id) ON DELETE CASCADE)'

我的表是InnoDB的,而且都是空的。

這裏是我使用插入到表中的語句:

$query = "INSERT INTO user_table (username, password, email)VALUES (:user, :pass, :em);"; 
    $args = array(
     ":user" => $m_username, 
     ":pass" => $m_password, 
     ":em" => $m_email 
     ); 

所以我的問題:

1)這是正確的方式來建立我的數據庫表的庫存系統RPG類型的遊戲?

2)爲什麼我在嘗試插入數據庫時​​收到此錯誤?

編輯 我的數據庫的SQL轉儲:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; 

-- 
-- Database: `sik_game_db` 
-- 

CREATE TABLE IF NOT EXISTS `game_items` (
    `game_item_id` int(11) NOT NULL AUTO_INCREMENT, 
    `item_name` varchar(100) NOT NULL, 
    PRIMARY KEY (`game_item_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 


CREATE TABLE IF NOT EXISTS `user_inventory` (
    `user_inventory_id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(11) NOT NULL, 
    `game_item_id` int(11) NOT NULL, 
    `quantity` int(11) NOT NULL, 
    PRIMARY KEY (`user_inventory_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 


CREATE TABLE IF NOT EXISTS `user_table` (
    `user_id` int(11) NOT NULL AUTO_INCREMENT, 
    `username` varchar(100) NOT NULL, 
    `password` varchar(100) NOT NULL, 
    `email` varchar(100) NOT NULL, 
    `level` int(11) NOT NULL, 
    `location` int(11) NOT NULL, 
    PRIMARY KEY (`user_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 


-- 
-- Constraints for table `game_items` 
-- 
ALTER TABLE `game_items` 
ADD CONSTRAINT `game_items_ibfk_1` FOREIGN KEY (`game_item_id`) REFERENCES `user_inventory` 
(`user_inventory_id`) ON DELETE CASCADE; 

-- 
-- Constraints for table `user_table` 
-- 
ALTER TABLE `user_table` 
ADD CONSTRAINT `user_table_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user_inventory` 
(`user_inventory_id`) ON DELETE CASCADE; 

感謝湯姆

+3

它看起來像你的外鍵約束是建立倒退。即在創建user_table之前,必須有一個帶有User_ID的user_inventory記錄。如果您發佈了用於創建外鍵約束的代碼,或者您可以自行修復它們! :) – Marryat 2013-03-23 21:56:11

+0

我把它用phpMyAdmin的用戶界面,所以我選擇了在USER_TABLE PMA和選擇的關係,然後選擇user_inventory表表的列表,並與game_item_id相同。我希望這有幫助。我可以發佈我可以從PMA導出的SQL腳本?謝謝 – 2013-03-23 22:01:18

+0

我曾經使用過PMA,但我無法訪問它。或者轉儲出sql,或者嘗試以其他方式創建鏈接,然後查看是否可以解決您的問題。 – Marryat 2013-03-23 22:02:41

回答

3

正如我懷疑,外鍵約束是圍繞着錯誤的方式。

您將需要通過其他方式重新創建約束。

或者,你應該能夠運行代碼:

ALTER TABLE `user_table` DROP FOREIGN KEY `user_table_ibfk_1`; 

ALTER TABLE `user_inventory` 
ADD CONSTRAINT `user_table_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user_table` 
(`user_id`) ON DELETE CASCADE; 

外鍵約束應該被添加到表中,要確保任何記錄添加到該表中,已經存在於另一個表。所以在你的例子中。您要確保在將記錄添加到user_inventory表中時,user_table中已經有一個記錄的user_id正確。

你需要制定出你的邏輯對其他外鍵約束,以確保一個已經設置在正確的表。

+0

他還需要將索引添加到user_inventory.user_id和user_inventory.game_item_id,否則上述查詢將失敗。 – WhyteWolf 2013-03-23 22:22:37

+0

我的理解是索引是在創建外鍵約束時在innodb中自動創建的嗎?但我沒有這麼長時間,很高興被告知我錯了! – Marryat 2013-03-23 22:26:01

+0

@WhyteWolf就像編輯user_inventory字段是一個索引一樣簡單?感謝您的幫助 – 2013-03-23 22:49:27