【问题标题】:SQL Error 1822 : Failed to add the foreign key constaint. Missing index for constraint BUT the index EXISTSSQL 错误 1822:添加外键约束失败。缺少约束索引但索引存在
【发布时间】:2016-05-23 23:01:27
【问题描述】:

我正在尝试添加具有 2 列的外键。

这里是引用外键的表的 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:添加外键约束失败。引用表“sf_file_category”中的约束“fk_sf_file_sf_file_category1”缺少索引。

我假设他的意思是已经在表 sf_file_category 中创建的 INDEX fk_sf_file_sf_file_category1_idx (id_file_category ASC, file_type ASC)。

有没有什么特别的方法可以创建我缺少的多字段外键?

【问题讨论】:

  • 在我这边执行没有任何问题。
  • 字段类型及其排序规则应匹配
  • @GiorgosBetsos 您最终使用了哪个工具?尝试了这个唯一的语句,但仍然得到“[HY000][1215] 无法添加外键约束”...
  • 我使用的是 MySQL Workbench 6.3,而服务器版本是 5.6.26

标签: mysql foreign-keys


【解决方案1】:

就像提到的@Pankaj Pandey 一样,我的字段声明不完全匹配,id_file_category 在一个表上是 NULL 而在另一个表上是 NOT NULL 会阻止外键创建。

【讨论】:

    猜你喜欢
    • 2017-09-16
    • 2014-12-07
    • 2019-02-27
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多