1

只是通过为游戏即时构建设置数据库的过程。

它有 3 个表:

用户表

user_id - PK

用户名

密码

电子邮件

等级

地点

用户库存

user_inventory_id - PK

user_id - FK

game_item_id - FK

数量

游戏项目

game_item_id - PK

项目名称

现在在我的注册脚本中,我简单地将一条记录插入到 user_table 中,保存用户名、电子邮件和密码,但是由于我创建了其他两个表并在 user_inventory 表中创建了 user_id 和 game_item_id 外键,所以我收到了这个错误:

带有消息“SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败(sik_game_db. user_table, CONSTRAINT user_table_ibfk_1FOREIGN KEY ( user_id) REFERENCES user_inventory( user_inventory_id) ON DELETE CASCADE)”的“PDOException”

我的表是 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;

谢谢汤姆

4

1 回答 1

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 的记录。

您将需要为其他外键约束制定逻辑,以确保已在正确的表上设置了该约束。

于 2013-03-23T22:19:02.837 回答