2016-02-12 537 views
0

我试图添加一个带有2列的外键。SQL错误1822:无法添加外键约束。约束缺少索引但索引EXISTS

下面是表的DDL引用的外键:

CREATE TABLE IF NOT EXISTS `sf_file_category` (
    `id_file_category`  INT       NOT NULL AUTO_INCREMENT, 
    `name`     VARCHAR(45) 
          CHARACTER SET 'latin1' 
          COLLATE 'latin1_general_ci' NOT NULL, 
    `file_type`    ENUM('document', 'image', 'video', 'archive') 
          CHARACTER SET 'latin1' 
          COLLATE 'latin1_general_ci' NULL, 
    `id_file_category_parent` INT UNSIGNED    NULL, 
    PRIMARY KEY (`id_file_category`), 
    INDEX `fk_sf_file_category_sf_file_category1_idx` (`id_file_category_parent` ASC), 
    INDEX `fk_sf_file_category_sf_file_idx` (`id_file_category` ASC, `file_type` ASC) 
) 
    ENGINE = InnoDB; 

DDL表谁拥有的外键:

CREATE TABLE IF NOT EXISTS `sf_file` (
    `id_file`   INT UNSIGNED    NOT NULL AUTO_INCREMENT, 
    `fullpath`   VARCHAR(100) 
         CHARACTER SET 'latin1' 
         COLLATE 'latin1_general_ci' NOT NULL, 
    `basename`   VARCHAR(45) 
         CHARACTER SET 'latin1' 
         COLLATE 'latin1_general_ci' NOT NULL, 
    `accesskey`   CHAR(8) 
         CHARACTER SET 'latin1' 
         COLLATE 'latin1_general_ci' NOT NULL, 
    `file_type`   ENUM('document', 'image', 'video', 'archive') 
         CHARACTER SET 'latin1' 
         COLLATE 'latin1_general_ci' NULL, 
    `name`    VARCHAR(45) 
         CHARACTER SET 'latin1' 
         COLLATE 'latin1_general_ci' NULL, 
    `description`  VARCHAR(255) 
         CHARACTER SET 'latin1' 
         COLLATE 'latin1_general_ci' NULL, 
    `id_aircraft_image` SMALLINT UNSIGNED   NULL, 
    `id_aircraft`  SMALLINT UNSIGNED   NULL, 
    `id_file_category` INT UNSIGNED    NULL, 
    PRIMARY KEY (`id_file`), 
    INDEX `fk_sf_file_sf_file_category1_idx` (`id_file_category` ASC, `file_type` ASC), 
    INDEX `fk_sf_file_sf_aircraft1_idx` (`id_aircraft` ASC), 
    INDEX `fk_sf_file_sf_aircraft2_idx` (`id_aircraft_image` ASC) 
) 
    ENGINE = InnoDB 
    DEFAULT CHARACTER SET = latin1 
    COLLATE = latin1_general_ci; 

尝试执行以下外键语法:

ALTER TABLE `sf_file` 
ADD CONSTRAINT `fk_sf_file_sf_file_category1` 
    FOREIGN KEY (`id_file_category` , `file_type`) 
    REFERENCES `sf_file_category` (`id_file_category` , `file_type`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION; 

但是我收到此错误: 错误:错误1822:失败添加外键constants。被引用表'sf_file_category'中缺少约束'fk_sf_file_sf_file_category1'的索引。

我假定他是指已经在表sf_file_category中创建的INDEX fk_sf_file_sf_file_category1_idxid_file_category ASC,file_type ASC)。

是否有任何特定的方式来创建多个字段外键,我失踪?

+0

执行没有任何问题在我的一端。 –

+1

字段的类型及其排序规则应该匹配 –

+0

@GiorgosBetsos您在结尾使用的工具?试过这个唯一的陈述,但仍然得到“[HY000] [1215]无法添加外键约束”... – Aphax

回答

0

赞提@Pankaj Pandey,我的字段声明并不完全匹配,id_file_categoryNULL在一张表上,NOT NULL在另一个上会阻止外键创建。