2014-09-24 50 views
1

我在设置名为CustomerCustomer_Number的两个表之间建立关系时遇到问题。我有两个表都设置为InnoDB都有索引,但是当我去创建外键时,我得到一个“没有索引定义”的错误。以下是一些屏幕截图创建外键的问题

这是客户表。 enter image description here

这是Customer_Number表。

enter image description here 这里是我尝试创建外键时的错误消息。

enter image description here 最后,这是我在尝试手动创建关系时得到的错误。

enter image description here 我似乎无法弄清楚这个问题,而且这让我疯狂!

输出为SHOW CREATE TABLE Customer

CREATE TABLE `Customer` (
`Customer_ID` int(11) NOT NULL AUTO_INCREMENT, 
`First` varchar(255) NOT NULL, 
`Last` varchar(255) NOT NULL, 
PRIMARY KEY (`Customer_ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 

和输出SHOW CREATE TABLE Customer_Number

CREATE TABLE `Customer_Number` (
`Num_ID` int(11) NOT NULL AUTO_INCREMENT, 
`Customer_ID` int(11) NOT NULL, 
`Number` varchar(255) NOT NULL, 
PRIMARY KEY (`Num_ID`), 
KEY `Customer_ID` (`Customer_ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 
+0

@MichaelBerkowski与所需的信息更新 – Jcmoney1010 2014-09-24 16:42:27

+0

我嗯其实没有问题,创建这些表,然后加入FK,或在原来的定义与FK创建它们。这工作:'ALTER TABLE Customer_Number ADD FOREIGN KEY(Customer_ID)REFERENCES Customer(Customer_ID);' – 2014-09-24 16:47:35

+0

当我把你给我的东西,我得到这个错误'#1452 - 无法添加或更新子行:外键约束失败('thesnoopz'.'#sql-23d7_8c3428',CONSTRAINT'#sql-23d7_8c3428_ibfk_1' FOREIGN KEY('Customer_ID')REFERENCES'Customer'('Customer_ID'))' – Jcmoney1010 2014-09-24 16:49:58

回答

1

张贴是正确的,应该能够接受一个新的FOREIGN KEY约束上Customer_Number.Customer_ID因为这两个CREATE TABLE声明满足必要的标准(与引用列相同的数据类型,可比较的索引或引用列上的主键)。

ALTER语句成功在我的测试:

ALTER TABLE Customer_Number ADD FOREIGN KEY (Customer_ID) REFERENCES Customer (Customer_ID); 

作为陌生与phpMyAdmin如何提炼一些RDBMS的错误,这是很难肯定地说,究竟出了什么问题在GUI。但是,如果手动运行ALTER语句并遇到有关失败的外键约束的错误,则表明引用表已包含列中未引用父表中的有效行值的值。为了揭开这些行,这样就可以解决这些问题,执行类似的查询:

SELECT * FROM Customer_Number WHERE Customer_ID NOT IN (SELECT Customer_ID FROM Customer) 

一旦你找到了问题的行,您可以将其删除(如果不需要)或更新它们的值的有效行的值值在参考表中。如果列的定义允许NULL(您不支持),您也可以UPDATE将它们设置为NULL,然后再次运行ALTER语句。

也可以暂时禁用外键检查,添加约束,更新行以匹配有效父表值,重新启用外键检查。

0

请试试这个。

alter table Customer_Number add foreign key(customer_ID) references Customer (Customer_ID);