【问题标题】:Why my table doesnt support FOREIGN KEYS?为什么我的表不支持外键?
【发布时间】:2012-10-11 13:04:53
【问题描述】:

我在mysql中做了一个数据库和10个表(表类型NONE) 而且我无法创建外键。一条警告消息说

SQLyog 所选表不支持外键。 表引擎必须是 InnoDB、PBXT 或 SolidDB

我现在必须改变我所有的桌子吗? 感谢您的任何提示或建议

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    通常,InnoDB 用于支持外键和事务:

    http://dev.mysql.com/doc/refman/5.1/en/innodb.html

    您可以随时更改表引擎:

    ALTER TABLE tableName ENGINE = InnoDB;
    

    您还可以更改默认值 -- 用于新创建的表 -- 如下所示:

    http://dev.mysql.com/doc/refman/5.1/en/storage-engine-setting.html

    【讨论】:

    • “或更改默认值,如图所示”不太正确,因为更改默认值不会更改已创建表格的格式。
    【解决方案2】:

    您使用的引擎不支持外键(正如错误消息清楚地告诉您的那样)。您可以更改正在使用的引擎

    ALTER TABLE `tableName` ENGINE = newEngine;
    

    【讨论】:

      【解决方案3】:

      是的。默认存储引擎 (MyISAM) 不支持外键约束。

      【讨论】:

        【解决方案4】:

        MyISAM 引擎确实支持外键。它不支持外键约束。

        您可以继续创建任意数量的外键 - 但不要指望数据库会为您强制执行完整性。

        不要在没有经过大量测试的情况下更改应用程序中的引擎;更换引擎会影响行为,如果没有非常小心和大量 QA 工作,不建议这样做。特别是,如果出现以下情况,从 MyISAM 切换到 InnoDB 会破坏您的应用程序:

        • 它不能正确处理死锁(MyISAM 上不会发生死锁)
        • 它需要表级锁定
        • 它依赖于(大部分是可疑的)MyISAM 功能
        • 它是高性能的,您还没有理解如何正确调整 InnoDB,但确实很好地调整了 MyISAM(或确定)
        • 您尚未评估切换引擎对磁盘空间的影响

        【讨论】:

        • @MarkR:MyISAM 不支持外键。如果您尝试向 MyISAM 表添加外键约束,MySQL 会允许该语法,但会默默地忽略外键添加。在我的书中,这几乎不能算作对外键的支持。
        • 它以某种方式进行;支持的语法但不支持该功能仍然允许您在引擎上运行标准 SQL 脚本。但是对于不知情的人来说,在执行此类脚本时不被警告不支持的键约束是很糟糕的。
        【解决方案5】:

        在找到this post 之前,我遇到了同样的问题。

        为了解决 MyISAM 或 NDB (Cluster) 的限制,约束 可以使用触发器强制执行。

        【讨论】:

          猜你喜欢
          • 2012-10-09
          • 2010-09-29
          • 1970-01-01
          • 1970-01-01
          • 2020-04-04
          • 2012-11-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多