2016-02-14 99 views
0

我有如下表:无法麻烦下探唯一约束

CREATE TABLE FlightInstance (
FLNO INT, 
FDate VARCHAR(10), 

PRIMARY KEY (FLNO, FDate) 
) ENGINE = INNODB; 

我增加了以下限制:

 
    ALTER TABLE FlightInstance ADD CONSTRAINT FDATE_UNIQUE UNIQUE (FDate); 

我为了加入这个约束能够使用FDate作为参考键做到这一点(否则我会得到一个错误):

 
    ALTER TABLE FlightLegInstance ADD FOREIGN KEY (FDate) REFERENCES 
    FlightInstance(FDate); 
所以我填充我的表,并遇到了这两个条目到 FlightInstance表中的问题:
 
    INSERT INTO FlightInstance (FLNO, FDate) VALUES (1000 ,"10/5/2015"); 
    ... 
    INSERT INTO FlightInstance (FLNO, FDate) VALUES (1010 ,"10/5/2015"); 

所以,我认为我需要的,因为我有同样价值观的2 FDate下降的唯一约束FDATE_UNIQUE,但在发出此命令时,我得到这个错误:

 
    Error on rename of './foo/#sql-699d_5b353' to './foo/FlightInstance' (errno:
150)
所以我做了一些研究,有的说我应该删除我的外键约束,因为我使用的是InnoDB,所以我成功地用下面的命令做了:
 
    alter table FlightInstance drop foreign key FlightInstance_ibfk_1; 

但我仍然得到同样的错误如上。我使用的命令是:

 
    alter table FlightInstance drop index FDATE_UNIQUE; 

代替index在命令我还用UNIQUE KEY无济于事。

任何帮助,非常感谢。

回答

0

可能还有另外一个外键引用索引,这就是为什么drop index不能成功。

为了找出哪些外键导致错误,在尝试删除索引后立即运行SHOW ENGINE INNODB STATUS,然后查看LATEST FOREIGN KEY ERROR部分。

+0

是的,还有另外一个外键引用了这个。我知道它是什么桌子。但是,我如何处理这些信息呢?我仍然希望它成为'FlightLegInstance'(在本文中使用)和另一个表中的参考键。有没有办法使用'FDate'作为参考而不强加唯一约束?对不起,我只是坚持如何解决这个问题。 – Kenshin

+0

是的,你可以这样做,因为索引不必是唯一的。因此,首先删除所有外键,然后删除唯一索引,然后在fdate上添加一个非unuque索引,然后再添加外键。 – Shadow

0

@Kenshin,您在FlightLegInstance上定义了外键,而不是FlightInstance。因此您必须从FlightLegInstance中删除外键。我试图和它的工作,如下所示:

mysql> alter table FlightLegInstance drop foreign key flightlegInstance_ibfk_1 

查询OK,0行的影响(0.11秒) 记录:0重复:0警告:0

的MySQL>改变表FlightInstance降索引FDATE_UNIQUE;

查询OK,0行的影响(0.23秒) 记录:0重复:0警告:0

的MySQL> INSERT INTO FlightInstance(FLNO,FDATE)VALUES(1010, “2015年10月5日”) ; 查询OK,1行受影响(0.06秒)