创建外键的问题

时间:2014-09-24 16:30:07

标签: mysql sql database phpmyadmin

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

这是Customer表。 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

2 个答案:

答案 0 :(得分:1)

发布的两个CREATE TABLE语句是正确的,并且应该能够在FOREIGN KEY上接受新的Customer_Number.Customer_ID约束,因为符合必要的条件(与引用列相同的数据类型,可比较引用列上的索引或主键。)

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语句。

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

答案 1 :(得分:0)

请试试这个。

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