【问题标题】:"A foreign key constraint fails" when converting a table from InnoDB to MyISAM将表从 InnoDB 转换为 MyISAM 时出现“外键约束失败”
【发布时间】:2014-01-30 02:01:24
【问题描述】:

由于某种原因,我的 Django Web 应用程序中的 MySQL 表使用了不同的格式,这导致了外键约束错误(例如在 this question 中)。

表格格式如下所示。

SHOW TABLE STATUS WHERE `Name` in ('') ...
+----------------------------+--------+---------+------------+--------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+---------------------
| Name                       | Engine | Version | Row_format | Rows   | Avg_row_length | Data_length | Max_data_length  | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time          
+----------------------------+--------+---------+------------+--------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+---------------------
| table_0                    | MyISAM |      10 | Dynamic    |    341 |             83 |       28472 |  281474976710655 |        19456 |         0 |            346 | 2013-09-05 15:52:11 | 2014-01-10 14:17:18 | 2013-09-05 15:52:11 
| table_1                    | MyISAM |      10 | Dynamic    |  66422 |             49 |     3297260 |  281474976710655 |      2025472 |         0 |         141146 | 2013-07-20 19:12:24 | 2014-01-10 19:20:21 | 2013-07-20 19:12:27 
| table_2                    | MyISAM |      10 | Dynamic    |      3 |             53 |         160 |  281474976710655 |         3072 |         0 |              4 | 2013-07-20 19:12:27 | 2013-07-20 19:12:27 | 2013-07-20 19:12:27 
| table_3                    | MyISAM |      10 | Dynamic    |      8 |             99 |         796 |  281474976710655 |         3072 |         0 |             10 | 2013-07-20 19:12:27 | 2013-07-20 19:12:27 | 2013-07-20 19:12:27 
| table_4                    | MyISAM |      10 | Dynamic    |      0 |              0 |           0 |  281474976710655 |         1024 |         0 |              1 | 2013-07-20 19:12:27 | 2013-07-20 19:12:27 | 2013-07-20 19:12:27 
| table_5                    | InnoDB |      10 | Compact    |      0 |              0 |       16384 |                0 |        16384 |   7340032 |              1 | 2013-11-20 14:04:02 | NULL                | NULL                
| table_6                    | InnoDB |      10 | Compact    |      0 |              0 |       16384 |                0 |        16384 |   7340032 |              1 | 2013-11-20 14:03:39 | NULL                | NULL                
| table_7                    | MyISAM |      10 | Dynamic    |    860 |            125 |      107624 |  281474976710655 |        25600 |         0 |            977 | 2013-11-20 14:04:35 | 2014-01-06 18:32:57 | 2013-11-20 14:04:35 
| table_8                    | MyISAM |      10 | Fixed      |   6632 |             21 |      139272 | 5910974510923775 |       173056 |         0 |           6753 | 2013-07-20 19:16:47 | 2014-01-09 11:26:36 | 2013-07-20 19:16:47 

我尝试按照this question 中的说明更新表格格式。但收到以下错误。

mysql> SET FOREIGN_KEY_CHECKS=0; 
mysql> alter table ztrap_emailreportoptin engine = MyISAM;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

如何使引擎在表之间保持一致?

(另外,知道这是怎么开始的吗?)

【问题讨论】:

    标签: python mysql sql django


    【解决方案1】:

    尝试将 MyISAM 转换为 InnoDB,例如

    alter table ztrap_emailreportoptin engine = InnoDB;
    

    这样您就可以让服务器对所有表强制执行外键检查。

    【讨论】:

    • Andy,该表已经使用 InnoDB。其余的表使用 MyISAM,我想将它们全部设为 MyISAM。
    【解决方案2】:

    MyISAM does not support foreign keys。 要转换为 MyISAM,您需要先删除所有外键约束。

    您的错误消息告诉您,您的表 ztrap_emailreportoptin 要么引用了另一个表,要么被另一个表引用。

    您可以通过以下方式列出此类参考:

    SELECT
        table_name, column_name, constraint_name,
        referenced_table_name, referenced_column_name
    FROM information_schema.key_column_usage
    WHERE referenced_table_name IS NOT NULL;
    

    但是,我建议您将表转换为 InnoDB。

    【讨论】:

    • 这行得通,解释也很合理。谢谢。
    猜你喜欢
    • 2014-06-23
    • 2010-11-16
    • 1970-01-01
    • 2021-09-28
    • 2016-06-14
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 2013-05-29
    相关资源
    最近更新 更多