MySQL ERROR 1072:States Key不存在,但确实存在

时间:2012-09-24 00:01:21

标签: mysql sql unique-index

道歉,如果这是一个新手问题,但我一直无法解决这个问题,我希望有更好理解MySQL的人可以帮助我解决以下问题:

我有两个表要维护,以便用户可以定义他们的首选项,而管理员可以维护他们对这些首选项的访问权限。我想确保如果管理员删除某些权限,则首选项表会更新:

这两个表是:

main_access
+--------------+---------+------+-----+---------+-------+
| Field        | Type    | Null | Key | Default | Extra |
+--------------+---------+------+-----+---------+-------+
| nav_location | int(11) | NO   | PRI | NULL    |       |
| user_id      | int(11) | NO   | PRI | NULL    |       |
+--------------+---------+------+-----+---------+-------+

main_prefs
+--------------+---------+------+-----+---------+-------+
| Field        | Type    | Null | Key | Default | Extra |
+--------------+---------+------+-----+---------+-------+
| nav_location | int(11) | NO   | PRI | NULL    |       |
| user_id      | int(11) | NO   | PRI | NULL    |       |
+--------------+---------+------+-----+---------+-------+

他们都有独特的索引,我运行它:

CREATE TABLE IF NOT EXISTS main_access (
    nav_location    integer not null,
    user_id         integer not null,
    unique index uk_access (nav_location, user_id)
);

CREATE TABLE IF NOT EXISTS main_pref (
    nav_location    integer not null,
    user_id         integer not null,
    unique index uk_pref (nav_location, user_id)
);

因此,正在创建具有上述表的uk_access和uk_pref。然而,当我跑步时:

ALTER TABLE main_pref 
ADD CONSTRAINT FK_access1 
FOREIGN KEY(uk_pref) REFERENCES main_access(uk_access) 
ON UPDATE CASCADE 
ON DELETE CASCADE;

我得到“ERROR 1072(42000):关键列'uk_pref'在表中不存在”错误。对我来说,这是没有意义的。我知道密钥存在,因为我在创建表后也运行了以下内容:

ALTER TABLE main_pref ADD UNIQUE INDEX uk_pref (nav_location, user_id);

并获得了重复的密钥警告。我对另一张桌子做了同样的事情 我还尝试使两个表的唯一索引名称相同。也就是说,我把它们都uk_pref,但无济于事。同样的错误 我觉得这是一个我很想念的非常简单的问题,但却一直无法看到它。我希望另一双眼睛会指出我正在犯的错误。非常感谢任何帮助!

我找了类似的问题,但在这里找不到任何解决同一问题的问题。

编辑:AJ指出了这一点,我忘了提到我试过了:
我也(第一次)尝试绕过设置唯一键并执行以下操作:

ALTER TABLE main_pref 
ADD CONSTRAINT FK_access1 
FOREIGN KEY(user_id, nav_location) REFERENCES main_access(user_id, nav_location) 
ON UPDATE CASCADE 
ON DELETE CASCADE;

MySQL刚回来时出现语法错误。

1 个答案:

答案 0 :(得分:2)

您按错误的顺序给出了键定义中的列

ALTER TABLE main_pref 
ADD CONSTRAINT FK_access1 
FOREIGN KEY(nav_location,user_id) REFERENCES main_access(nav_location,user_id) 
ON UPDATE CASCADE 
ON DELETE CASCADE;

这很好用

http://sqlfiddle.com/#!2/16751

必须按照CREATE TABLE语句中键定义的顺序给出FK列。换句话说,(nav_location,user_id)上的复合indes不能用于满足(user_id,nav_location)上的FK定义,就像在原始帖子中一样。