source

오류 코드: 1822.외부 키 제약 조건을 추가하지 못했습니다.제약 조건에 대한 인덱스 누락

ittop 2023. 10. 29. 19:59
반응형

오류 코드: 1822.외부 키 제약 조건을 추가하지 못했습니다.제약 조건에 대한 인덱스 누락

오류에 대한 스레드를 몇 개 찾았습니다.하지만 모든 해결책이 저에게는 통하지 않습니다.

저는 사용자 테이블 2개와 기사용 테이블 1개를 만들었습니다.이제 기사를 작성한 사용자와 마지막 수식어를 저장하고 싶습니다.

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.외부 키 제약 조건을 추가하지 못했습니다.참조된 테이블 'users'에 제약 조건 'fk_article_users1'에 대한 인덱스가 없습니다.

활동했습니다.

SHOW ENGINE innodb STATUS;

하지만 이건 오류를 보여주지 않습니다.

create_user INT UNSIGNED ZEROFILL참조할 수 없음id INT, 이들은 외국 키 참조의 목적을 위해 서로 다른 데이터 유형으로 간주되기 때문입니다.동일한 데이터 유형으로 만듭니다.

외부 키 관계에서 열 사이에 허용되는 유일한 데이터 유형 차이는 변수의 길이입니다.예를 들어, VARCHAR(10)은 VARCHAR(20)을 참조하거나 그 반대의 경우도 있습니다.

데이터 유형, 크기 또는 문자 집합의 다른 차이는 참조 무결성과 호환되지 않습니다.

가 있음에도ZEROFILL한 열에는 있지만 다른 열에는 데이터 유형이 호환되지 않습니다.

이 문제를 발견했고 데이터 유형이 정확해서 조금 당황했지만 모든 것을 똑같이 만들었을 뿐입니다.

외부 키를 작성할 때 사용 중인 열이 동일한지 확인합니다.

  • 자료종류
  • 콜렉션
  • 영채움
  • Null 아님
  • 미서명
  • 이진법

외부 키를 사용하여 한 테이블의 한 열을 다른 테이블에 참조할 때 참조하는 열이 기본 키여야 하거나 고유해야 합니다.그럼 쓰시오

ALTER TABLE table_name1
ADD CONSTRAINT constraint_name
FOREIGN KEY(column_name_in_table_name1) 
REFERENCES table_name2(column_name_in_table_name2);

이 정도면 충분합니다.

표와 같이 을 반환하는 열을 사용할 수 있습니다.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    |          |
...

두 열 모두 동일한 대조군을 가져야 합니다.

열 집합을 변경하는 방법

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

저한테 일어난 일입니다.

MySQL로 이 스택 오버플로 질문에 참여하는 사람이 있는 경우error code 1822, 부모 테이블과 자식 테이블에 동일한 데이터 유형을 유지한 후에도 여전히 동일한 오류가 발생합니다.

그럼 source table로 확인 부탁드립니다.table1's참조되고 있는 열table2색인화되어 있습니다 / 로 선언됩니다.primary key아니면unique.

뭔가 미묘한 문제가 있을 겁니다alter table진술.정의 변경articles문제를 해결합니다.

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 Fiddle입니다.

저의 경우 FK의 이름이 전체 데이터베이스에 걸쳐 고유해야 한다는 것을 몰랐다는 오류가 있었습니다.FK의 이름을 변경하면 문제가 해결되었습니다.

저도 SQL을 배우면서 똑같은 오류가 발생하고 있습니다.가능한 모든 방법을 시도한 후, 저는 외부 키를 활성화하는 것보다 참조된 테이블의 기본 키를 활성화해야 한다는 것을 알았습니다.도움이 되기를 바랍니다.

-- 외래키추가및제거

SHOW DATABASES;
USE test;
DESCRIBE addresses;
DESCRIBE people;

ALTER TABLE people
ADD CONSTRAINT FK_PeopleAddress
FOREIGN KEY (address_id) REFERENCES addresses(id);

저는 기본 데이터 베이스에 기본 데이터 집합이 다르다는 것이 문제는 저의 기본 데이터 베이스가 다르다는 것이었습니다.데이터베이스에 대한 기본 모음과 FK가 참조하려는 필드 모음이 일치하는지 확인합니다.

상위 테이블이 다른 테이블의 자식이 아닌지 확인합니다.

웬일인지 그래.->unsignedBigInteger()저한테는 안 통했어요

그래서 이 부분에서 약간 바꿨습니다.$table->unsignedBigInteger('owner_id');

대상:$table->bigInteger('owner_id')->unsigned();

이제 효과가 있네요!

포워드 엔지니어 중에 mysql workbench에서 이 오류를 받았습니다.인덱스와 fk가 정확한지(Unique 또는 PK vals)를 두 번 확인한 결과, 'FOREN KEYS 생성 건너뛰기'와 'FK 인덱스 생성도 건너뛰기'를 선택하여 이를 해결할 수 있었습니다.

그리고는 위의 옵션을 선택한 성공적인 포워드 엔지니어를 얻고 있었습니다.전달 엔지니어가 성공한 후에는 해당 옵션을 선택 취소(기본값)한 상태에서 두 번째 실행을 시도합니다.

이것이 저에게 효과가 있었습니다.

저는 프라이머리 키가 없고 외국 키 제한()을 적용하고 있으니 프라이머리가 존재하는지 확인하세요.

같은 문제지만 해결됐습니다.저는 외국 키를 작성하면서 같은 표를 참조하고 있었습니다.

foreign key(id)references same_table(id),

그것이 오류의 원인이었습니다.

외부 키가 여러 열로 구성된 경우 하위 테이블의 외부 키 선언에 있는 열의 순서가 상위 테이블의 인덱스에 있는 열의 순서와 일치하지 않으면 이 문제가 발생합니다.

CREATE TABLE parent_table(
  foo INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  bar INT NOT NULL,
  -- Order must match this unique constraint.
  CONSTRAINT ux_parent_table UNIQUE(foo, bar)
);

CREATE TABLE child_table(
  bar INT NOT NULL,
  foo INT NOT NULL,
  -- Error, order does not match parent.
  CONSTRAINT fk_error FOREIGN KEY(bar, foo) REFERENCES parent_table(bar, foo),
  -- Correct, order matches parent.
  CONSTRAINT fk_correct FOREIGN KEY(bar, foo) REFERENCES parent_table(bar, foo)
);

중요한 것은 상위 테이블의 인덱스에 있는 열의 순서입니다.상위 테이블의 열 순서 자체는 중요하지 않습니다.

언급URL : https://stackoverflow.com/questions/26329775/error-code-1822-failed-to-add-the-foreign-key-constaint-missing-index-for-con

반응형