0

私はアジャイルYiiの本をやっています。

とにかく、私はこのコマンドを実行しようとしています:

INSERT INTO tbl_project_user_assignment (project_id, user_id) values ('1','1'), ('1','2');

そして、私はこのエラーを受け取ります:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`trackstar_dev`.`tbl_project_user_assignment`, CONSTRAINT `FK_project_user` FOREIGN KEY (`project_id`) REFERENCES `tbl_project` (`id`) ON DELETE CASCADE)

だから..tbl_projectテーブルにproject_id=1があるかどうか見てみましょう。クイックSELECT*FROMtbl_project;を実行しました。そしてプロジェクトは存在します。

では、ユーザーを確認してみましょう。SELECT* FROM tbl_user; ID1と2のうん2ユーザー。

私は何が間違っているのですか?タイプミスはありますか?アジャイルyiiの本にはいくつかのタイプミスがありますが、それらはそれほど深刻ではなく、新しすぎるため、正誤表は報告されていません(すでにチェック済み)。

ソースコードのデータベーススキーマは次のとおりです。

-- Disable foreign keys
SET FOREIGN_KEY_CHECKS = 0 ;

-- Create tables section -------------------------------------------------

-- Table tbl_project

CREATE TABLE IF NOT EXISTS `tbl_project` (
  `id` INTEGER NOT NULL auto_increment,
  `name` varchar(128) NOT NULL,
  `description` text NOT NULL,
  `create_time` DATETIME default NULL,
  `create_user_id` INTEGER default NULL,
  `update_time` DATETIME default NULL,
  `update_user_id` INTEGER default NULL,
  PRIMARY KEY  (`id`)
) ENGINE = InnoDB
;

-- DROP TABLE IF EXISTS `tbl_issue` ;

CREATE TABLE IF NOT EXISTS `tbl_issue` 
( 
  `id` INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `name` varchar(256) NOT NULL,
  `description` varchar(2000), 
  `project_id` INTEGER,
  `type_id` INTEGER,
  `status_id` INTEGER,
  `owner_id` INTEGER,
  `requester_id` INTEGER,
  `create_time` DATETIME,
  `create_user_id` INTEGER,
  `update_time` DATETIME,
  `update_user_id` INTEGER  
) ENGINE = InnoDB
; 

-- DROP TABLE IF EXISTS `tbl_user` ;

-- Table User

CREATE TABLE IF NOT EXISTS `tbl_user` 
(
  `id` INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `email` Varchar(256) NOT NULL,
  `username` Varchar(256),
  `password` Varchar(256),
  `last_login_time` Datetime,
  `create_time` DATETIME,
  `create_user_id` INTEGER,
  `update_time` DATETIME,
  `update_user_id` INTEGER
) ENGINE = InnoDB
; 

-- DROP TABLE IF EXISTS `tbl_project_user_assignment` ;

-- Table User

CREATE TABLE IF NOT EXISTS `tbl_project_user_assignment`
(
  `project_id` Int(11) NOT NULL,
  `user_id` Int(11) NOT NULL,
  `create_time` DATETIME,
  `create_user_id` INTEGER,
  `update_time` DATETIME,
  `update_user_id` INTEGER,
 PRIMARY KEY (`project_id`,`user_id`)
) ENGINE = InnoDB
;


-- The Relationships 
ALTER TABLE `tbl_issue` ADD CONSTRAINT `FK_issue_project` FOREIGN KEY (`project_id`) REFERENCES `tbl_project` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT;

ALTER TABLE `tbl_issue` ADD CONSTRAINT `FK_issue_owner` FOREIGN KEY (`owner_id`) REFERENCES `tbl_user` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT; 

ALTER TABLE `tbl_issue` ADD CONSTRAINT `FK_issue_requester` FOREIGN KEY (`requester_id`) REFERENCES `tbl_user` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT; 

ALTER TABLE `tbl_project_user_assignment` ADD CONSTRAINT `FK_project_user` FOREIGN KEY (`project_id`) REFERENCES `tbl_project` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT;

ALTER TABLE `tbl_project_user_assignment` ADD CONSTRAINT `FK_user_project` FOREIGN KEY (`user_id`) REFERENCES `tbl_user` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT;   

-- Insert some seed data so we can just begin using the database
INSERT INTO `tbl_user` 
  (`email`, `username`, `password`) 
VALUES 
  ('test1@notanaddress.com','Test_User_One', MD5('test1')),
  ('test2@notanaddress.com','Test_User_Two', MD5('test2'))    
;

-- Enable foreign keys
SET FOREIGN_KEY_CHECKS = 1 ;

とにかく、よろしくお願いします!

編集:プロジェクトが実際に存在することの明確化^^。

mysql> select id、name from tbl_project;

+ ---- + ------------------- +

| id | 名前|

+ ---- + ------------------- +

| 6 | プロジェクト1|

| 1 | プロジェクトゾンビ1|

+ ---- + ------------------- +

セットの2行(0.00秒)

4

2 に答える 2

2

tbl_project_user_assignment の project_id と user_id は、INTEGER ではなく INT(11) として入力されます。INTEGER は 4 バイトで、INT(11) は 8 バイトになると思いがちです。

上でコメントしたように、INTEGER は問題を修正します。

于 2010-08-26T00:32:41.170 に答える
0

これはあなたが遭遇した奇妙な問題であり、それに対する奇妙な修正でもあります。私の知る限り、INTEGER、INT、またはINT(XX)(XXはいくつかの数値)の間に内部的な違いはありません。これらはすべて同じデータ型であり、同じバイトストレージ割り当てと最小/最大範囲を備えています。これは、一部のfk関係のタイプの不一致のMySQL評価では役割を果たさないはずです。私のバージョン/構成のMySQL(5.1.49)は、あるテーブルでINT(11)を使用し、別のテーブルでINTEGERを使用した場合に発生するのと同じ制約違反をスローしません。これはどういうわけかあなたの設定に関連しているのか、それとも他の外部DBツールを使用しているのだろうか。

MySQLデータ型の内部について詳しくは、次を参照してください。

http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

このページで特に興味深いもの:

別の拡張機能がMySQLでサポートされており、整数データ型の表示幅を、型のbaseキーワードに続く括弧内にオプションで指定できます(たとえば、INT(4))。このオプションの表示幅は、アプリケーションで、列に指定された幅よりも小さい幅の整数値をスペースで左パディングして表示するために使用できます。(つまり、この幅は、結果セットとともに返されるメタデータに存在します。使用されるかどうかは、アプリケーションによって異なります。)表示幅は、列に格納できる値の範囲や数値を制限しません。列に指定された幅を超える幅の値に対して表示される桁数。たとえば、SMALLINT(3)として指定された列の通常のSMALLINT範囲は-32768〜32767です。

于 2010-09-23T18:13:47.747 に答える