[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.CREATE_USER INT UNSIGNED ZEROFILL 수없는 참조 번호 INT 때문에 외래 키 참조의 목적을 위해 서로 다른 데이터 유형 이들 카운트. 그 동일한 데이터 형식합니다.
CREATE_USER INT UNSIGNED ZEROFILL 수없는 참조 번호 INT 때문에 외래 키 참조의 목적을 위해 서로 다른 데이터 유형 이들 카운트. 그 동일한 데이터 형식합니다.
외래 키 관계 열 사이에서 허용되는 데이터 타입 만 차이가 VARCHAR의 길이이다. 예를 들어, VARCHAR (10) VARCHAR (20)를 참조 할 수 있거나 그 반대.
데이터 형식, 크기, 문자 세트에서 다른 차이는 참조 무결성에 대한 호환되지 않습니다.
심지어 하나 개의 컬럼에 ZEROFILL을 가지고 있지만 다른 데이터 유형이 호환합니다.
-
==============================
2.나는이 문제를 건너 온 나는 조금을 위해 난처한 상황에 빠진 그래서 내 데이터 유형은 정확하지만 난 그냥 모든 것을 동일했다.
나는이 문제를 건너 온 나는 조금을 위해 난처한 상황에 빠진 그래서 내 데이터 유형은 정확하지만 난 그냥 모든 것을 동일했다.
수 외래 키를 만들 때 당신이 사용하고있는 열은 같은있다 :
-
==============================
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.당신은 열 이름에 특별한 조합으로 테이블 계정 예를 들어, 열 정렬을 반환 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.내 경우, 오류가 나는 FKS의 이름은 전체 데이터베이스에서 고유해야한다는 것을 몰랐습니다. 이름 바꾸기 FK 문제를 해결했습니다.
내 경우, 오류가 나는 FKS의 이름은 전체 데이터베이스에서 고유해야한다는 것을 몰랐습니다. 이름 바꾸기 FK 문제를 해결했습니다.
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
'SQL' 카테고리의 다른 글
[SQL] SQLSTATE는 [23000] : 무결성 제약 조건 위반 : 1452 추가 또는 자식 행을 업데이트 할 수 없습니다가 : 외래 키 제약 조건이 실패 (0) | 2020.07.13 |
---|---|
[SQL] 어떻게 예약 된 SQL을 키워드로 명명 된 테이블 열을 처리하기 위해? (0) | 2020.07.13 |
[SQL] 필드 이름을 대괄호 안에 대괄호를 탈출하는 방법 (0) | 2020.07.12 |
[SQL] 다른 데이터베이스에서 테이블에 외래 키 (0) | 2020.07.12 |
[SQL] 가중 행 확률로 PostgreSQL의 테이블에서 임의의 행을 선택 (0) | 2020.07.12 |