2013-03-23 88 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