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


218

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' 

4
올바르게 기억한다면 기본 키는 항상 고유 인덱스이므로 고유 인덱스 문을 삭제해야합니까?
Mr47

1
ON DELETE NO ACTION외래 키의 전체 사용을 삭제합니다. 그렇게 할 특별한 이유가 없다면.
AmazingDreams

4
@AmazingDreams 왜? 여전히 참조 무결성을 강화합니다. 어린이 만 직접 삭제해야합니다. 이는 하나의 잘못된 키워드를 삭제하여 실수로 많은 데이터를 삭제할 수있는 계단식 삭제보다 안전합니다.
GolezTrol

1
stackoverflow.com/a/5810024/1567737 왜 '별칭'을 사용할 때 별명을 사용하면 목적이 즉시 명확 해 집니까?
AmazingDreams

@AmazingDreams 팁 주셔서 감사합니다. 나는 주변의 논쟁도 좋아합니다. 장단점을 배우는 데 도움이됩니다.
Git-able

답변:


534

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

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

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

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

15
당신이 말한대로. 나머지 CREATE 쿼리에서 동일한 idcategory iduser 이름으로 많은 제약 조건이 자동으로 생성되었습니다. 도와 주셔서 감사합니다!
Git-able

1
MySQL Workbench가 생성 스크립트를 내보낼 때이 문제를 해결했을 것이라고 생각했지만, 프로젝트를 열 때 이런 종류의 경고를 "무시"한다고 생각합니다.
SnowInferno

감사합니다, 친구 :) 그것은 저에게 많은 도움이되고 이제 외래 키에 대한 나의 관습이 다르고

확인할 수 있습니다. 그러나 참조 된 테이블이 이미 삭제되었지만 명명 된 제약 조건이 존재하면 어떻게해야합니까? 존재하지 않는 테이블에서 제약 조건을 삭제할 수 있습니까? MySQL 5.6에서 현재 MariaDB로 업데이트해야한다고 생각합니다.
Anse

3
감사합니다 : 제약은 전체 데이터베이스에 대해 고유해야합니다
sebasira

31

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

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


그것은 내 경우의 문제였습니다. 나는 그것을 결코 추측하지 않았을 것이고 당신은 내 하루를 구했습니다. 이제 fk_id_1, fk_id_2 등을 사용하십시오. 감사.
JackLeEmmerdeur

15

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

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


6

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

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

fk_TableName_ColumnName

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

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

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


4

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

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

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

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


3

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

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

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


1

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


1

새 테이블을 만들 때이 문제가 발생했습니다. 내가 준 외래 키 이름은 이미 사용 중입니다. 키 이름을 바꾸면 문제가 해결되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.