抱歉,如果这是一个新手问题,但我已经有一段时间无法解决这个问题了,希望对 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): Key column 'uk_pref' doesn't exist in table”错误。对我来说,这对我来说是零意义的。我知道密钥存在,因为在创建表后我还运行了以下命令:
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 刚刚返回了一个语法错误。