不寻常的MySQL错误1005/1025

时间:2015-10-19 18:35:48

标签: mysql

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

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),它也可以运行FINE。我可以将此表重命名为我想要的任何内容(包括更长的名称),hotstick_work_orders除外。尝试给出了错误#1025,但仅限于该特定名称。

E.g:

 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表中找到任何现有约束。

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

1 个答案:

答案 0 :(得分:1)

你可能遇到的是缓存命名的坏情况。正确的服务器重启可能会解决您的问题,但正如您所提到的,由于共享服务器配置,您无法执行此操作。

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

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