当前位置: 首页 > 知识库问答 >
问题:

错误代码:1822。添加外键Constaint失败。缺少约束索引

琴修为
2023-03-14
CREATE TABLE IF NOT EXISTS `testDb`.`users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `nickname` VARCHAR(255) NULL,
  `first_name` VARCHAR(255) NULL,
  `last_name` VARCHAR(255) NULL,
  `e_mail` VARCHAR(255) NOT NULL,
  `activated` TINYINT(1) NOT NULL DEFAULT 0,
  `birth_date` DATE NULL,
  `locked` TINYINT(1) NOT NULL DEFAULT 0,
  `locked_date_time` DATETIME NULL,
  `street` VARCHAR(255) NULL,
  `street_number` VARCHAR(255) NULL,
  `city` VARCHAR(255) NULL,
  `postal_code` VARCHAR(255) NULL,
  `country` VARCHAR(255) NULL,
  `phone` VARCHAR(255) NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `user_id_UNIQUE` (`id` ASC)
)
ENGINE = InnoDB
AUTO_INCREMENT = 1;


CREATE TABLE IF NOT EXISTS `testDb`.`articles` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) NULL,
  `description` VARCHAR(255) NULL,
  `create_user` INT ZEROFILL NOT NULL,
  `create_date_time` DATETIME NULL,
  `last_modifie_user` INT ZEROFILL NOT NULL,
  `last_modifie_date_time` DATETIME NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `article_id_UNIQUE` (`id` ASC),
  INDEX `fk_articles_users1_idx` (`create_user` ASC),
  INDEX `fk_articles_users2_idx` (`last_modifie_user` ASC)
)
ENGINE = InnoDB
AUTO_INCREMENT = 1;


ALTER TABLE `testDb`.`articles`
  ADD CONSTRAINT `fk_articles_users1`
    FOREIGN KEY (`create_user`)
    REFERENCES `testDb`.`users` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  ADD CONSTRAINT `fk_articles_users2`
    FOREIGN KEY (`last_modifie_user`)
    REFERENCES `testDb`.`users` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION;

我得到以下错误,但我不明白为什么我应该有一个索引。

错误代码:1822。添加外键Constaint失败。引用的表“users”中缺少约束“fk_articles_users1”的索引

我激活了

SHOW ENGINE innodb STATUS;

但这并没有显示出任何错误。

共有1个答案

孟璞
2023-03-14

create_user INT无符号ZeroFill不能引用id INT,因为出于外键引用的目的,这些类型被视为不同的数据类型。使它们具有相同的数据类型。

外键关系中的列之间唯一允许的数据类型差异是VARCHAR的长度。例如,VARCHAR(10)可以引用VARCHAR(20),反之亦然。

对于引用完整性而言,数据类型、大小或字符集中的任何其他差异都是不兼容的。

 类似资料:
  • 问题内容: 我发现了有关该错误的一些线索。但是所有解决方案都不适合我。 我为用户表创建了2个表,为文章创建了1个表。现在,我要存储创建文章的用户和最后一个修饰符的用户。 我收到以下错误,但我不明白为什么要为此添加索引。 错误代码:1822。无法添加外键约束。引用表“ users”中约束“ fk_articles_users1”的缺少索引 我活跃 但这不会显示任何错误。 问题答案: 不能引用,因为出

  • 问题内容: 我正在尝试通过使用外键来确保表之间的数据一致性,以便DBMS可以检查错误。但是,由于某些原因,我们似乎无法做到这一点。有什么错误,还有替代方法吗?另外,当我填写具有外键的表时,无法填写为外键保留的字段,对吗?另外,外键是否完全视为键? 问题答案: 最可能的问题是此行: classLeader的数据类型为VARCHAR(255)。这有 匹配数据类型 的引用的列… 。当然,表必须存在,列也

  • 问题内容: 我在数据库中创建2个表: 和: 当我在沼泽中运行查询时,出现此错误: SQL查询: 说:文档 #1822-无法添加外键约束。参照表“药物”中约束“ fk_med_pharmacy_medication1”的缺少索引 这些表已经存在,但是我更改了一个字段。 问题答案: 外索引中引用的列必须被索引。您需要在添加索引。实际上,这可能应该是表的主键。

  • 我有两张桌子。第一个是人口;第二个是空的。 我希望第二个有一个外键,它引用第一个中的一列。 null 架构: 填充。为空。 不能成为的外键: MySQL没有提供错误的原因;不返回: 我拥有所需的数据库权限。 我已经仔细检查了列(甚至表)是否具有相同的排序规则(字符集不适用于INT列): MySQL无法添加外键约束 MySQL:错误1215(HY000):无法添加外键约束 无法添加外键约束-MySQ

  • 问题内容: 尝试创建两个表时收到错误消息。有一个多值依赖项,因此我分离了表并提出了这个建议: 但是,当尝试使用此代码添加值时: 我收到臭名昭著的1452错误: 我不完全确定这意味着什么,因为我在第一个表中具有NameID自动递增功能。我不能在第二个中使用auto_increment,因为它是外键,对吗?在此先感谢您的帮助。 问题答案: 您已经在列上定义了外键约束,即在表中使用insert作为电话表

  • 问题内容: 我收到此错误消息: 第40行的错误1217(23000):无法删除或更新父行:外键约束失败 …当我尝试放置桌子时: …定义如下: 有趣的是, 我已经删除 了模式中具有外键的 所有其他表。实际上,除了表外,数据库是空的。 如果数据库中没有其他对象,怎么可能会有子行?据我所知,InnoDB不允许在其他模式上使用外键,对吗? (我什至可以运行命令:-?) 问题答案: 两种可能性: 在另一个架