2011-10-01 87 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查询

相关问题