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

好的,那么让我们检查一下用户, SELECT * FROM tbl_user; 是的 2 个用户,ID 为 1 和 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;

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

| 编号 | 姓名 |

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

| 6 | 项目 1 |

| 1 | 项目僵尸 1 |

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

2 行(0.00 秒)

4

2 回答 2

2

tbl_project_user_assignment 中的 project_id 和 user_id 键入为 INT(11) 而不是 INTEGER。我倾向于认为 INTEGER 是 4 个字节,而 INT(11) 会变成 8 个字节。

正如上面评论的 INTEGER 解决了这个问题。

于 2010-08-26T00:32:41.170 回答
0

这是您遇到的一个奇怪问题,也是一个奇怪的解决方法。据我所知,INTEGER、INT 或 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 支持另一个扩展,用于在类型的基本关键字后面的括号中可选地指定整数数据类型的显示宽度(例如,INT(4))。应用程序可以使用此可选显示宽度来显示宽度小于为列指定的宽度的整数值,方法是用空格向左填充它们。(也就是说,这个宽度存在于结果集返回的元数据中。是否使用取决于应用程序。)显示宽度不限制可以存储在列中的值的范围,也不限制数量对于宽度超过为列指定的值显示的位数。例如,指定为 SMALLINT(3) 的列的 SMALLINT 范围通常为 -32768 到 32767,

于 2010-09-23T18:13:47.747 回答