道歉,如果这是一个新手问题,但我一直无法解决这个问题一段时间,我希望有人更好地理解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刚回来一个语法错误。
您确定可以针对索引创建外键约束吗?如果您将uk_pref索引中的列指定为元组而不是索引名称,那该怎么办? –
你的意思是我为什么不尝试: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
k - 我没有看到你的o.p.你曾尝试过这种方法。 –