2012-09-24 117 views
0

道歉,如果这是一个新手问题,但我一直无法解决这个问题一段时间,我希望有人更好地理解MySQL可以协助我在解密以下问题:

我有两个表,我想维护,以便用户可以定义他们的偏好,而管理员可以保持他们的访问权限,这些偏好。我想确保,如果管理员删除某些权利,即偏好表得到更新:

这两个表是:MySQL错误1072:国家密钥不存在,但它确实存在

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刚回来一个语法错误。

+0

您确定可以针对索引创建外键约束吗?如果您将uk_pref索引中的列指定为元组而不是索引名称,那该怎么办? –

+0

你的意思是我为什么不尝试: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 ;?如果是这样,我试过了,它会产生语法错误。另外,我很确定,但不是100%肯定的。我想是的,基于这个线程http://forums.mysql.com/read.php?135,427283,427283#msg-427283 – Thumper

+0

k - 我没有看到你的o.p.你曾尝试过这种方法。 –

回答

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

的FK列必须以相同的顺序被赋予作为关键定义在CREATE TABLE声明中。换言之,(nav_location,user_id)上的复合订单不能用于满足原始文章中(user_id,nav_location)的FK定义。

+0

我会试试这个,谢谢!截至目前,这给了错误1005,但这通常意味着我的alter table语句有一些异常。 – Thumper

+0

当我尝试构建完整模式时,使用sqlfiddle时出现同样的错误。我会开始抛出东西,直到我得到它......多么令人沮丧。 – Thumper

+0

有一些明显的异常,我不得不解决,我以前没有注意到。非常感谢你的答案。一般来说,这个问题真的帮助我解决了MySQL问题。 – Thumper

相关问题