道歉,如果这是一个新手问题,但我一直无法解决这个问题,我希望有更好理解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
,但无济于事。同样的错误
我觉得这是一个我很想念的非常简单的问题,但却一直无法看到它。我希望另一双眼睛会指出我正在犯的错误。非常感谢任何帮助!
我找了类似的问题,但在这里找不到任何解决同一问题的问题。
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 :(得分: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定义,就像在原始帖子中一样。