복붙노트

[SQL] 오류 코드 : 1822 외래 키 constaint를 추가하는 데 실패했습니다. 제약 조건에 대한 인덱스를 누락

SQL

오류 코드 : 1822 외래 키 constaint를 추가하는 데 실패했습니다. 제약 조건에 대한 인덱스를 누락

나는 오류에 대한 몇 가지 스레드를 발견했다. 그러나 모든 솔루션은 나를 위해 작동하지 않습니다.

나는 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;

나는 다음과 같은 오류가 발생합니다,하지만 난 그에 대한 인덱스가해야하는 이유를 나는 이해하지 못했다.

오류 코드 : 1822 외래 키 constaint를 추가하는 데 실패했습니다. 참조 된 테이블에 제약 조건 'fk_articles_users1'에 대한 인덱스를 누락 '사용자'

나는 활성화

SHOW ENGINE innodb STATUS;

하지만이 모든 오류를 표시하지 않습니다.

해결법

  1. ==============================

    1.CREATE_USER INT UNSIGNED ZEROFILL 수없는 참조 번호 INT 때문에 외래 키 참조의 목적을 위해 서로 다른 데이터 유형 이들 카운트. 그 동일한 데이터 형식합니다.

    CREATE_USER INT UNSIGNED ZEROFILL 수없는 참조 번호 INT 때문에 외래 키 참조의 목적을 위해 서로 다른 데이터 유형 이들 카운트. 그 동일한 데이터 형식합니다.

    외래 키 관계 열 사이에서 허용되는 데이터 타입 만 차이가 VARCHAR의 길이이다. 예를 들어, VARCHAR (10) VARCHAR (20)를 참조 할 수 있거나 그 반대.

    데이터 형식, 크기, 문자 세트에서 다른 차이는 참조 무결성에 대한 호환되지 않습니다.

    심지어 하나 개의 컬럼에 ZEROFILL을 가지고 있지만 다른 데이터 유형이 호환합니다.

  2. ==============================

    2.나는이 문제를 건너 온 나는 조금을 위해 난처한 상황에 빠진 그래서 내 데이터 유형은 정확하지만 난 그냥 모든 것을 동일했다.

    나는이 문제를 건너 온 나는 조금을 위해 난처한 상황에 빠진 그래서 내 데이터 유형은 정확하지만 난 그냥 모든 것을 동일했다.

    수 외래 키를 만들 때 당신이 사용하고있는 열은 같은있다 :

  3. ==============================

    3.테이블 변경 문에서 미묘한 문제가있을 수 있어야합니다. 기사의 정의를 변경하면 문제를 해결합니다

    테이블 변경 문에서 미묘한 문제가있을 수 있어야합니다. 기사의 정의를 변경하면 문제를 해결합니다

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

    여기에 SQL 바이올린입니다.

  4. ==============================

    4.당신은 열 이름에 특별한 조합으로 테이블 계정 예를 들어, 열 정렬을 반환 TABLE_NAME FROM SHOW FULL 열을 사용할 수 있습니다

    당신은 열 이름에 특별한 조합으로 테이블 계정 예를 들어, 열 정렬을 반환 TABLE_NAME FROM SHOW FULL 열을 사용할 수 있습니다

    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    |          |
    ...
    

    두 열은 같은 정렬을 사용합니다.

    열의 데이터 정렬을 변경하려면

    ALTER TABLE t1 MODIFY
        col1 VARCHAR(5)
          CHARACTER SET latin1
          COLLATE latin1_swedish_ci;
    

    그것은 나에게 일어난.

  5. ==============================

    5.내 경우, 오류가 나는 FKS의 이름은 전체 데이터베이스에서 고유해야한다는 것을 몰랐습니다. 이름 바꾸기 FK 문제를 해결했습니다.

    내 경우, 오류가 나는 FKS의 이름은 전체 데이터베이스에서 고유해야한다는 것을 몰랐습니다. 이름 바꾸기 FK 문제를 해결했습니다.

  6. from https://stackoverflow.com/questions/26329775/error-code-1822-failed-to-add-the-foreign-key-constaint-missing-index-for-con by cc-by-sa and MIT license