0

我有一个查询,但它详细显示错误 #1005 和 150。一些innodb

如何正确处理?

CREATE TABLE `iars` ( `id` int(10) unsigned NOT NULL auto_increment,
`SessionId` int(10) unsigned NOT NULL,
`TeacherId` int(10) unsigned NOT NULL,
`courseid` int(4) unsigned NOT NULL,
`semester` int(4) unsigned NOT NULL,
`PaperId` int(4) unsigned NOT NULL,   
`groupid` int(4) unsigned NOT NULL,
`Type` varchar(4) default 1,
PRIMARY KEY  (`id`),
UNIQUE KEY `Constrint_Index` 
(`SessionId`,`TeacherId`,`courseid`,`semester`,`PaperId`,`groupid`),
KEY `FK_tid` (`TeacherId`),
KEY `FK_gid` (`GroupId`),
KEY `FK_pid` (`PaperId`),
CONSTRAINT `FK_gid` FOREIGN KEY (`GroupId`) REFERENCES `groups` (`id`) ON DELETE
CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_pid` FOREIGN KEY (`PaperId`) REFERENCES `papers` (`p_id`) ON DELETE
CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_ssessionid` FOREIGN KEY (`SessionId`) REFERENCES `sessions` (`id`) ON
DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_tid` FOREIGN KEY (`TeacherId`) REFERENCES `teachers` (`id`) ON DELETE
CASCADE ON UPDATE CASCADE ) 
4

1 回答 1

2

MySQL 手册

您不能为由 FOREIGN KEY 约束引用的 InnoDB 表发出 DROP TABLE,除非您执行 SET foreign_key_checks = 0。当您删除表时,在其创建语句中定义的约束也将被删除。

如果您重新创建已删除的表,则它必须具有符合引用它的外键约束的定义。如前所述,它必须具有正确的列名和类型,并且必须在引用的键上具有索引。如果这些不满足,MySQL 返回错误号 1005 并在错误消息中引用错误 150。

这意味着您的其他表之一可能正在引用iars您未在其中重新创建的列。因此,解决方案是清除所有表(通过describe查询)并查看引用在哪里,然后在此处将引用的列添加到您的 CREATE TABLE 中,或者根据您的架构删除引用。

稍后在该引用页面上编辑一个非常有用的 gem:

SHOW ENGINE INNODB STATUS;

揭示了关于刚刚发生的外键错误的大量信息它应该准确地指出您需要查看的位置。

于 2012-07-22T15:01:17.963 回答