尝试插入时MySQL和外键冲突

尝试插入时MySQL和外键冲突,sql,mysql,yii,Sql,Mysql,Yii,我正在写《敏捷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_

我正在写《敏捷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_id是否为1。从tbl_项目中快速选择*;而且这个项目是存在的

好的,那么让我们检查一下用户,选择*fromtbl_user;是2个id为1和2的用户

我做错了什么?有打字错误吗?AgileYII的书有几个拼写错误,但它们没有那么严重,而且它太新了,所以没有报告勘误表(已经检查过)

以下是源代码中的数据库架构:

-- 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>从tbl_项目中选择id、名称

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

|id |名称|

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

|6 |项目1|

|1 |项目僵尸1|

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


集合中的两行(0.00秒)

tbl_项目用户分配中的项目id和用户id键入为INT(11),而不是整数。我倾向于认为整数是4个字节,INT(11)会变成8个字节


如上所述,INTEGER解决了这个问题。

这是您遇到的一个奇怪问题,也是一个奇怪的问题。据我所知,INTEGER、INT或INT(XX)(其中XX是一些数字)之间没有内部差异。它们都是相同的数据类型,具有相同的字节存储分配和最小/最大范围。这不应该在MySQL评估某些fk关系的类型不匹配时起作用。我的MySQL版本/配置(5.1.49)不会引发与在一个表中使用INT(11)和在另一个表中使用INTEGER时相同的约束冲突。我想知道这是否与您的配置有关,或者您是否正在使用其他外部DB工具

您可以在此处阅读有关MySQL数据类型内部的更多信息:

本页特别关注:

支持另一个扩展 MySQL,用于可选地指定 显示中整数数据类型的宽度 base关键字后面的括号 对于类型(例如,INT(4))。 此可选显示宽度可能为 由应用程序用于显示 宽度小于 大于指定的宽度 列,并用 空间。(即,此宽度为 存在于随返回的元数据中 结果集。无论是否使用 由应用程序决定。)显示 宽度不限制宽度的范围 可存储在中的值 列,也不是 对于具有 宽度超过指定的宽度 专栏。例如,列 指定为SMALLINT(3)的 SMALLINT范围为-32768到32767,以及 值超出了允许的范围 三个字符使用 超过三个字符


为什么tbl_project_user_赋值中的project_id和user_id被键入INT(11)而不是整数?我倾向于认为整数是4个字节,INT(11)会变成8个字节。这可能有点关系,可能没有。@MikeAinOz谢谢!!你修好了。这就是问题所在。我想我会提交一个勘误表。只是一个普通的Ubuntu框,服务器版本:5.1.41-3ubuntu12.6(Ubuntu)。我猜他们是在5.1.49节修好的?