2011-10-01 83 views
0

我有兩個表tbluserlogindetailtblRolesMySQL中的錯誤代碼1005,同時將外鍵應用於表

tbluserlogindetail是如下

CREATE TABLE `tbluserlogindetail` (
`LoginID` varchar(45) NOT NULL, 
`Name` varchar(45) DEFAULT NULL, 
`Password` varchar(45) DEFAULT NULL, 
PRIMARY KEY (`LoginID`), 
UNIQUE KEY `LoginID_UNIQUE` (`LoginID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$ 

EDIT doratestingtbluserlogindetail;

和我的第二個表tblRoles是如下

CREATE TABLE `tblroles` (
    `RoleID` int(11) NOT NULL, 
    `LoginID` varchar(45) NOT NULL, 
    PRIMARY KEY (`RoleID`,`LoginID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$ 

我嘗試了以下信息才能tblroles分配表的主鍵列LoginID,但我不知道我錯在哪裏任何一個可以幫助我。

我已經通過文件走了,但不能糾正錯誤,請幫我

ALTER TABLE tblroles ADD FOREIGN KEY (loginid) REFERENCES tbluserlogindetail(loginid)

回答

1

所引用的列必須是被引用表是唯一的。請嘗試以下選項之一:

  • 主鍵上tbluserlogindetail(ID, loginid)所以你可以使用它作爲你的外鍵,而不是(loginid)。這將要求您將tbluserlogindetail_ID列添加到tblroles
  • 嘗試在tbluserlogindetail表的LoginID列中添加唯一索引。這是唯一可能的,如果它實際上是獨特的。

此外,爲什麼您的主鍵tbluserlogindetail定義爲PRIMARY KEY (ID, LoginID)ID字段是一個自動遞增字段,並且已經是唯一的。那麼爲什麼你還要把LoginID作爲主鍵的一部分呢?我認爲你需要回到你的桌面設計並重新考慮選擇哪些列作爲主鍵。

+0

沒有得到你,你能告訴我應該在哪裏做出改變 – Dotnet

+0

你好'馬克Byers'我有一個問題,如果我加按你說我可以插入多個值意味着我將有'LoginID'和'RoleID'可以多次插入 – Dotnet

+0

Hi'Mark Byers'作爲'LoginID'應該是唯一的,所以我把它作爲主鍵 – Dotnet

0

這僅僅是猜測/假設,我喜歡在這裏分享,

PRIMARY KEY ( ID ,登錄ID )

在tbluserlogindetail

被認爲是代理鍵,

當我們執行的子表,那是tblroles,

子表預計在父表中的主鍵,

但實際上我們創建的代理鍵,由於這個原因,我改變查詢失敗,

ALTER TABLE tblroles ADD FOREIGN KEY (LoginID) REFERENCES tbluserlogindetail(LoginID) 

這是我的假設,給出反饋我的回答,

我以下更改執行ALTER表命令: 1。tblroles創建具有給定的創建查詢命令,之後創建的我手動刪除在tblroles表 LoginID主鍵,

  1. 更改VARCHAR在登錄ID爲int,

  2. tbluserlogindetail,刪除ID AUTO_INCREMENT,PK 。

  3. 檢查我更新ALTER查詢

相關問題