1

ゲームのビルド用にデータベースをセットアップするプロセスを実行しているところです。

3 つのテーブルがあります。

ユーザーテーブル

user_id - PK

ユーザー名

パスワード

Eメール

レベル

位置

ユーザー_在庫

user_inventory_id - PK

user_id - 外部キー

game_item_id - FK

ゲームアイテム

game_item_id - PK

項目名

今、登録スクリプトで、ユーザー名、電子メール、パスワードを保存するレコードを user_table に挿入するだけですが、他の 2 つのテーブルを作成し、user_inventory テーブルに user_id と game_item_id の外部キーを作成したため、このエラーが発生しています。

'PDOException' とメッセージ '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)'

私のテーブルは 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) データベースに挿入しようとすると、このエラーが表示されるのはなぜですか?

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;

ありがとうトム

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 に答える