2012-09-24 57 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

相關問題