只是通过为游戏即时构建设置数据库的过程。
它有 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
, CONSTRAINTuser_table_ibfk_1
FOREIGN KEY (user_id
) REFERENCESuser_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;
谢谢汤姆