2011-08-06 113 views
0

用下面的表违反约束上插入

CREATE TABLE `Play` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(11) DEFAULT NULL, 
    `room_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `IDX_FEBB7184A76ED395` (`user_id`), 
    KEY `IDX_FEBB718454177093` (`room_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

CREATE TABLE `User` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `username` varchar(255) NOT NULL, 
    `nickname` varchar(255) NOT NULL, 
    `email` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `UNIQ_2DA17977F85E0677` (`username`), 
    UNIQUE KEY `UNIQ_2DA17977A188FE64` (`nickname`), 
    UNIQUE KEY `UNIQ_2DA17977E7927C74` (`email`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

INSERT INTO `User` VALUES(1, 'user', 'nickname', '[email protected]'); 

CREATE TABLE `Room` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

INSERT INTO `Room` VALUES(1); 

ALTER TABLE `Play` 
    ADD CONSTRAINT `play_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `User` (`id`), 
    ADD CONSTRAINT `play_ibfk_2` FOREIGN KEY (`room_id`) REFERENCES `Room` (`id`); 

,并试图运行下面的语句

INSERT INTO `Play` (`id` ,`user_id` ,`room_id`) VALUES (NULL , '1', '1') 

我得到一个错误

#1452 - Cannot add or update a child row: a foreign key constraint fails 
(`play`, CONSTRAINT `play_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `User` (`id`)) 

两组数据,#1数据库中存在用户和#1房间。这怎么会失败?我对SQL很熟悉,但我不知道这种情况下的错误是什么......

+0

听起来很愚蠢,但只是为了确保当你从'User'选择id时,你会得到什么id ='1'? – yokoloko

+0

那么,如果我检查'1',我会得到用户。如果我检查“1”,我自然会得到一个错误......但是为什么查询会插入“1”呢?我使用phpMyAdmin创建它,并自动添加'''? –

回答

1

修正了它。这是唯一出现使用MySQL 5.5.9时,InnoDB和的Mac OS X 10.6

看到一个问题:MySQL Bug #60309

我改变的MySQL .conf加入这一行:

[mysqld] 
lower_case_table_names=1 

现在它起作用了。还是要谢谢你的帮助。

0

问题出在您执行查询的顺序。在创建外键约束之前,必须定义表“用户”和“房间”。

+0

这只是因为我按照这个顺序导出它们。所有表格已经存在。 –

+0

好的,这很有趣。因为,我复制粘贴你的确切查询(改变顺序)到MySQL和插入工作得很好! –

+0

那么,也许设置某处? –