[mysql] 오류 1022-쓸 수 없습니다. 테이블의 중복 키

create table 명령에서 중복 키와 관련하여 1022 오류가 발생합니다. 쿼리를 살펴본 결과 중복이 발생하는 위치를 이해할 수 없습니다. 다른 사람이 볼 수 있습니까?

SQL query:

-- -----------------------------------------------------
-- Table `apptwo`.`usercircle`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS  `apptwo`.`usercircle` (

 `idUserCircle` MEDIUMINT NOT NULL ,
 `userId` MEDIUMINT NULL ,
 `circleId` MEDIUMINT NULL ,
 `authUser` BINARY NULL ,
 `authOwner` BINARY NULL ,
 `startDate` DATETIME NULL ,
 `endDate` DATETIME NULL ,
PRIMARY KEY (  `idUserCircle` ) ,
INDEX  `iduser_idx` (  `userId` ASC ) ,
INDEX  `idcategory_idx` (  `circleId` ASC ) ,
CONSTRAINT  `iduser` FOREIGN KEY (  `userId` ) REFERENCES  `apptwo`.`user` (
`idUser`
) ON DELETE NO ACTION ON UPDATE NO ACTION ,
CONSTRAINT  `idcategory` FOREIGN KEY (  `circleId` ) REFERENCES  `apptwo`.`circle` (
`idCircle`
) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE = INNODB;

MySQL said: Documentation

#1022 - Can't write; duplicate key in table 'usercircle' 



답변

이름 iduser이나 idcategory데이터베이스에 제약이있을 가능성이 큽니다 . 그렇다면 제약 조건의 이름을 바꾸십시오.

제한은 작성 / 변경하는 특정 테이블뿐만 아니라 전체 데이터베이스에 대해 고유해야합니다.

제약 조건이 현재 사용중인 위치를 찾으려면 다음 쿼리를 사용할 수 있습니다.

SELECT `TABLE_SCHEMA`, `TABLE_NAME`
FROM `information_schema`.`KEY_COLUMN_USAGE`
WHERE `CONSTRAINT_NAME` IN ('iduser', 'idcategory');


답변

MySQL에서 외래 키 이름을 변경하십시오. 데이터베이스 테이블에서 동일한 외래 키 이름을 가질 수 없습니다.

모든 테이블과 모든 외래 키를 확인하고 동일한 이름을 가진 외래 키가 두 개인 것을 피하십시오.


답변

성공적으로 해결 된 두 개의 링크 와 명명 규칙 (Naming Convention) 에서 내가 직면했던 동일한 문제를 쉽게 해결할 수있었습니다. 즉, 외래 키 이름의 경우 fk _colName_ TableName으로 지정하십시오 . 이 명명 규칙은 모호하지 않으며 DB 모델의 모든 ForeignKey를 고유하게 만들어이 오류가 발생하지 않습니다.

오류 1022 : 쓸 수 없습니다. 테이블의 중복 키


답변

다른 사람들이 언급했듯이 제약 조건의 이름이 이미 DB의 다른 테이블에서 사용 중일 수 있습니다 . 데이터베이스 전체에서 고유해야합니다.

외래 키 제약 조건의 이름을 지정하는 좋은 규칙은 다음과 같습니다.

fk_TableName_ColumnName

충돌 가능성이 있는지 조사하기 위해 데이터베이스에서 사용하는 모든 제한 조건을이 쿼리와 함께 나열 할 수 있습니다.

SELECT * FROM information_schema.table_constraints WHERE constraint_schema = 'YOUR_DB';

이 쿼리를 실행할 때 이전에 테이블의 임시 복사본을 만들었으며이 복사본이 이미 사용하려는 제약 조건 이름을 사용하고 있음을 발견했습니다.


답변

방금 지난 4 시간 동안 같은 문제를 겪었습니다. 내가 한 것은 제약 조건에 고유 한 이름이 있는지 확인하는 것이 었습니다.

구속 조건의 이름을 바꿀 수 있습니다. 발생 횟수를 쉽게 추적 할 수 있도록 내 번호를 추가했습니다.

테이블의 제약 조건에 외래 키 X가있는 boy라는 이름이있는 경우 외래 키 X에 대한 다음 제약 조건을 boy1이라고 할 수 있습니다.

나는 당신이 나보다 더 나은 이름을 알아낼 것이라고 확신합니다. ?


답변

이는 특정 버전의 Percona Toolkit 온라인 스키마 변경 도구의 버그와 관련하여 발생할 수도 있습니다. 큰 테이블을 변경하려면 pt-osc는 먼저 중복 테이블을 생성하고 모든 레코드를 테이블에 복사합니다. 경우에 따라 일부 버전의 pt-osc 2.2.x는 새 테이블의 제약 조건에 이전 테이블의 제약 조건과 동일한 이름을 지정하려고합니다.

수정 사항은 2.3.0에서 릴리스되었습니다.

자세한 내용은 https://bugs.launchpad.net/percona-toolkit/+bug/1498128 을 참조하십시오.


답변

Mysql에 데이터베이스 이름이 이미 있는지 확인하고 이전 이름을 바꿉니다.