尝试INSERT时MySQL和外键冲突

时间:2010-08-25 23:04:28

标签: sql mysql yii

我在做Agile 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 * FROM tbl_project;并且项目存在。

好的,那就让我们检查用户,SELECT * FROM tbl_user; ID为1和2的Yup 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>从tbl_project中选择id,name;

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

| id |名字|

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

| 6 |项目1 |

| 1 | project zombied 1 |

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

2行(0.00秒)

2 个答案:

答案 0 :(得分:2)

tbl_project_user_assignment中的project_id和user_id被输入为INT(11)而不是INTEGER。我倾向于认为INTEGER是4 BYTES而INT(11)会去8 BYTES。

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

答案 1 :(得分:0)

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

可以在这里阅读更多关于MySQL数据类型内部的信息:

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

对此页面特别感兴趣:

  

支持另一个扩展   MySQL可选择指定   显示整数数据类型的宽度   base关键字后面的括号   对于类型(例如,INT(4))。   这个可选的显示宽度可以是   用于显示的应用程序   宽度小的整数值   比指定的宽度   用左边填充它们的列   空间。 (也就是说,这个宽度是   存在于返回的元数据中   结果集。是否使用   取决于应用程序。)显示   宽度不限制范围   可以存储在。中的值   列,也不是数字的位数   显示具有a的值   宽度超过规定的宽度   柱。例如,一列   指定为SMALLINT(3)具有通常的   SMALLINT范围-32768到32767,和   超出允许范围的值   使用显示三个字符   超过三个字符。