【问题标题】:Unusual MySQL error 1005/1025异常的 MySQL 错误 1005/1025
【发布时间】:2016-01-18 05:15:19
【问题描述】:

我似乎遇到了一个奇怪的情况,其中有一个我无法使用的特定表名。让我解释一下。

CREATE TABLE IF NOT EXISTS hotstick_work_orders (
    work_order_id BIGINT UNSIGNED NOT NULL,
    step_id TINYINT UNSIGNED NOT NULL,
    user_id INT UNSIGNED NOT NULL,
    FOREIGN KEY (work_order_id) REFERENCES work_orders (id) ON DELETE CASCADE ON UPDATE NO ACTION,
    FOREIGN KEY (step_id) REFERENCES hotstick_steps (id) ON DELETE NO ACTION ON UPDATE NO ACTION,
    FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE NO ACTION ON UPDATE NO ACTION,
    PRIMARY KEY (work_order_id, step_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这在我的本地 MySql 堆栈 (v5.6.17) 上运行良好,但是当我在 GoDaddy 上使用 PhpMyAdmin (v4.0.10.7, MySQL v5.5.42) 尝试它时给出错误代码 #1005。

好的,你说,这显然只是另一种 FK 定义不完全匹配的情况,或者可能是引用的表缺少列上的索引的情况。但是,我什至无法在没有 FK 的情况下创建表 - 以下同样失败:

CREATE TABLE IF NOT EXISTS hotstick_work_orders (
    work_order_id BIGINT UNSIGNED NOT NULL,
    step_id TINYINT UNSIGNED NOT NULL,
    user_id INT UNSIGNED NOT NULL,
    PRIMARY KEY (work_order_id, step_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

更有趣的是,如果我运行原始的创建表查询但使用不同的名称,即使是 hotstick_work_order(没有最终的 s),它也可以正常工作。我可以将此表重命名为我想要的任何名称(包括更长的名称),hotstick_work_orders 除外。尝试给出错误 #1025,但仅限于该特定名称。

例如:

 RENAME TABLE hotstick_work_order TO hotstick_work_orders;
 Resulting Error: #1025 - Error on rename of './db/hotstick_work_order' to './db/hotstick_work_orders' (errno: -1)

 # Whereas this works fine:
 RENAME TABLE hotstick_work_order TO hotstick_work_orders_something;

我没有任何以前使用该名称的表,我也无法在 information_schema.table_constraints 表中找到任何现有约束。

当然我可以使用不同的表名来管理,没什么大不了的,但我很好奇 - 什么可能导致这种行为?

【问题讨论】:

  • 您是否检查过该名称的数据库文件是否已经存在?也许你已经从其他一些失败的操作留下了剩菜,而 mysql 正确地拒绝重命名你当前的数据库文件,因为那会破坏那些其他文件。
  • 这可能会解决您的问题:stackoverflow.com/questions/160233/….
  • 我在哪里可以找到这些? information_schema 中的“文件”表为空。
  • @GordonLinoff 我已经看到了,不,它没有帮助。请仔细阅读我的问题。
  • 你试过重启MySQL服务看看是否解决了吗?

标签: mysql


【解决方案1】:

您可能正在遭受缓存命名的糟糕情况。正确重启服务器可能会解决您的问题,但正如您所提到的,由于共享服务器配置,您无法这样做。

当我要求您创建一个具有确切名称的 MyISAM 表时,我们可以确定问题确实是与您的表名相关的缓存索引或约束。现在我建议你做的是:

  1. 尝试修复 MyISAM 表。
  2. 尝试优化表格。
  3. 执行SELECT SQL_NO_CACHE * FROM TABLE 以阻止 MySQL 缓存查询。
  4. 放下桌子。
  5. 按照您的意愿重新创建它(带有约束和所有,InnoDB)。

【讨论】:

  • 感谢您的回答,不幸的是这仍然不起作用(按顺序执行所有步骤)。 :/ 如果我无法在共享主机上手动清除缓存,我可能只能忍受它——当然不是世界末日。
  • @Brian 如果您有一个小型数据库,您也可以尝试从头开始重新创建它。
  • 使用 SQL_NO_CACHE 再次尝试 - 结果与以前相同。
  • 这不是“大数据”大,但它仍然比它的价值更麻烦。这确实看起来像是一个缓存问题,但是这个特定名称是如何被缓存的对我来说是个谜,因为我今天才第一次使用它,并且该操作失败了。
  • 不幸的是,除了忽略它/使用不同的表名之外,我没有。但是,由于没有其他想法出现,因此我决定接受您的回答,因为这可能是原因 - 我想我们会在下次 GoDaddy 重新启动 Apache 时看到...
猜你喜欢
  • 2016-02-08
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
相关资源
最近更新 更多