2016-12-14 580 views
2

我们不支持InnoDB数据库。因此,在从5.0迁移到MySQL 5.5之前,我希望将所有InnoDB表更改为MyISAM,但其中很多都有外键约束。set foreign_key_checks = 0不起作用MySQL 5.0

因此,我想在会话级别上禁用它,执行set foreign_key_checks=0但仍然获得相同的外键错误。

任何建议都会有很大的帮助。

mysql> SET foreign_key_checks = 0; 
Query OK, 0 rows affected (0.00 sec) 

mysql> use sn; 
Database changed 
mysql> alter table facility engine='MyISAM'; 
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails 

令人惊讶:

mysql> SHOW Variables WHERE Variable_name='foreign_key_checks'; 
Empty set (0.00 sec) 

mysql> SET foreign_key_checks = 0; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SHOW Variables WHERE Variable_name='foreign_key_checks'; 
Empty set (0.00 sec) 

MySQL 5.0 documentation显示变量确实存在。

Here is the table structure of `facility` table: 
| facility | CREATE TABLE `facility` (
    `FacilityId` bigint(20) NOT NULL auto_increment, 
    `FacilityName` varchar(45) default NULL, 
    `ViewerId` bigint(20) default NULL, 
    `MessageTemplate` varchar(256) default NULL, 
    `RecApp` varchar(60) default NULL, 
    `RecFacility` varchar(60) default NULL, 
    `SendApp` varchar(60) default NULL, 
    `SendFacility` varchar(60) default NULL, 
    `MirthChannelEnable` int(1) NOT NULL default '0', 
    `CompletenessCriteria` int(2) NOT NULL, 
    `RetryLimit` int(2) NOT NULL default '3', 
    `WatchDelay` int(11) NOT NULL, 
    `RetryDelay` int(11) NOT NULL, 
    `AckTimeOut` int(11) NOT NULL, 
    `KeepConOpen` int(1) NOT NULL default '0', 
    `SendTimeout` int(11) NOT NULL, 
    `EncryptURL` int(1) NOT NULL default '0', 
    `Host` varchar(15) NOT NULL, 
    `Port` int(11) NOT NULL, 
    `CreationDate` timestamp NOT NULL default CURRENT_TIMESTAMP, 
    `Description` varchar(256) default NULL, 
    `EventLogOffset` int(11) NOT NULL default '0', 
    PRIMARY KEY (`FacilityId`), 
    KEY `Fk_Fac_ViewerId_idx` (`ViewerId`), 
    CONSTRAINT `Fk_Fac_ViewerId` FOREIGN KEY (`ViewerId`) REFERENCES `viewer` (`ViewerId`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 | 
+0

显示表结构 –

+0

@MuhammadMuazzam感谢您的询问,补充。不适用于其他表格,因为有限制,所以可能不是表格特定的问题。 – kingsmasher1

回答

1

正如MySQL文档foreign key constraint说(高亮是我的):

而且,如果一个表有外键约束,ALTER TABLE不能用来改变表使用另一个存储引擎。 要更改存储引擎,您必须首先删除任何外键约束。

该文档来自v5.5,但我认为这个限制也适用于v5.0。

UPDATE

是的,我发现甲骨文网站上的V5.0手册和relevant section说的一样:

而且,如果一个InnoDB表有外键约束,ALTER TABLE不能使用将表更改为使用其他存储引擎。要更改存储引擎,您必须首先删除任何外键约束。

+0

由于我们正在移动到不支持外键的MyISAM,可以放弃它们而不是重新创建吗? – kingsmasher1

+0

我想你已经知道这个问题的答案... – Shadow

+0

感谢您的回答。这有帮助。 upvote并接受:) – kingsmasher1