我在做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秒)
答案 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,和 超出允许范围的值 使用显示三个字符 超过三个字符。