0

抱歉,如果这是一个新手问题,但我已经有一段时间无法解决这个问题了,希望对 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 刚刚返回了一个语法错误。

4

1 回答 1

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 定义。

于 2012-09-24T01:06:14.213 回答