我在设置名为Customer
和Customer_Number
的两个表之间的关系时遇到问题。我将两个表设置为InnoDB
都有索引,但是当我去创建外键时,我得到一个“没有索引定义”的错误。以下是一些屏幕截图
这是Customer表。
这是Customer_Number表。
这是我尝试创建外键时的错误消息。
最后,这是我在尝试手动创建关系时遇到的错误。
我似乎无法弄清楚这个问题,这让我疯了!
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 :(得分: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);