Php 游戏资源清册数据库外键

Php 游戏资源清册数据库外键,php,mysql,database,phpmyadmin,Php,Mysql,Database,Phpmyadmin,只是通过建立一个数据库的过程,为一个游戏im建设 它有3个表: 用户表 用户id-主键 用户名 密码 电子邮件 水平仪 位置 用户库存 用户\u库存\u id-主键 用户标识-FK 游戏项目id-FK 数量 游戏项目 游戏\u项目\u id-主键 项目名称 现在,在我的注册脚本中,我简单地将一条记录插入到user_表中,保存用户名、电子邮件和密码,但由于我制作了另外两个表,并在user_inventory表中制作了user_id和game_item_id外键,我收到了以下错误: 带有消息“SQL

只是通过建立一个数据库的过程,为一个游戏im建设

它有3个表:

用户表

用户id-主键

用户名

密码

电子邮件

水平仪

位置

用户库存

用户\u库存\u id-主键

用户标识-FK

游戏项目id-FK

数量

游戏项目

游戏\u项目\u id-主键

项目名称

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

带有消息“SQLSTATE[23000]:完整性约束冲突:1452无法添加或更新子行:外键约束失败(
sik\u game\u db
user\u table
,约束
user\u table\u ibfk\u 1
外键(
user\u id
)引用
user\u inventory
user\u inventory\u id
)“在删除级联时”

我的桌子是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) 为什么我在尝试插入数据库时收到此错误

编辑 my DB的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;

谢谢Tom,正如我所怀疑的,外键约束是错误的

您将需要以另一种方式使用引用重新创建约束

或者,您应该能够运行以下代码:

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_表中已存在具有正确user_id的记录


您需要计算出另一个外键约束的逻辑,以确保已在正确的表上设置了一个外键约束。

看起来您的外键约束是向后设置的。i、 e.在创建用户表之前,必须有一个具有用户ID的用户库存记录。如果您发布了用于创建外键约束的代码,这将有所帮助,或者您可以自己修复它!:)我使用phpmyadmin用户界面进行设置,因此我在PMA中选择了user_表,选择了relationships,然后在表列表中选择了user_inventory表,以及game_item_id。我希望这能有所帮助。我可以发布我可以从PMA导出的SQL脚本??谢谢我用过一次PMA,但我没有访问权限。要么转储sql,要么尝试以另一种方式创建链接,看看这是否解决了您的问题。我试过另一种方法,但PMA不让我这么做。感谢这两个约束看起来都在错误的表上。两者都应该在用户_库存中,PMA不允许您的问题很可能是您创建的匹配字段没有索引,或者它们与类型不匹配,由于它在另一个方向工作,很可能是索引问题。他还需要向user_inventory.user_id和user_inventory.game_item_id添加索引,否则上述查询将失败。我的理解是,索引是最近在innodb中创建外键约束时自动创建的?但我已经很久没这么做了,很高兴被告知我错了@这为什么像编辑用户库存字段作为索引这么简单??谢谢你的帮助,我已经有了一个索引,但是是的,就是这么简单,一旦添加了索引,你就应该能够在正确的方向上添加FK约束。显然@Marryat我是弄错索引的人。MySQL现在会自动创建索引。然而,我知道PMA仍然强制索引首先存在。如果用户完全不使用查询,而不是使用第三方工具,那么它很可能会按预期工作。