错误代码:1822.无法添加外键constaint.缺少约束索引

Tri*_*val 13 mysql sql

我发现了一些关于错误的线索.但是所有解决方案对我都不起作用.

我创建了2个表用户表和一个用于文章.现在我想存储创建文章的用户和最后一个修饰符的用户.

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;
Run Code Online (Sandbox Code Playgroud)

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

错误代码:1822.无法添加外键constaint.缺少引用表'users'中约束'fk_articles_users1'的索引

我活跃了

SHOW ENGINE innodb STATUS;
Run Code Online (Sandbox Code Playgroud)

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

Bil*_*win 15

create_user INT UNSIGNED ZEROFILL无法引用id INT,因为这些用作外键引用的不同数据类型.使它们成为相同的数据类型.

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

数据类型,大小或字符集的任何其他差异与参照完整性不兼容.

即使ZEROFILL在一列但不在另一列上,也会使数据类型不兼容.


小智 8

当您使用外键将一个表的一列引用到另一表时请确保您引用的列应该是主键或者应该是唯一的。然后使用

ALTER TABLE table_name1
ADD CONSTRAINT constraint_name
FOREIGN KEY(column_name_in_table_name1) 
REFERENCES table_name2(column_name_in_table_name2);
Run Code Online (Sandbox Code Playgroud)

这对你有用。


小智 6

我遇到了这个问题,我的数据类型是正确的,所以我被难住了一点,但后来我把一切都做了一样。

创建外键时,请确保您使用的列具有相同的内容:

  • 数据类型
  • 整理
  • 零填充
  • 不为空
  • 未签名
  • 二进制


Car*_*ina 5

您可以使用SHOW FULL COLUMNS FROM table_name它返回列Collat​​ion,例如对于accounts列上具有特殊排序规则的表name

mysql> SHOW FULL COLUMNS FROM accounts;
+----------+--------------+-------------------+------+-----+---------+----------+
| Field    | Type         | Collation         | Null | Key | Default | Extra    |
+----------+--------------+-------------------+------+-----+---------+----------|
| id       | int(11)      | NULL              | NO   | PRI | NULL    | auto_inc |
| name     | varchar(255) | utf8_bin          | YES  |     | NULL    |          |
| email    | varchar(255) | latin1_swedish_ci | YES  |     | NULL    |          |
...
Run Code Online (Sandbox Code Playgroud)

两列必须具有相同的排序规则。

更改列的排序规则

ALTER TABLE t1 MODIFY
    col1 VARCHAR(5)
      CHARACTER SET latin1
      COLLATE latin1_swedish_ci;
Run Code Online (Sandbox Code Playgroud)

这事发生在我身上。