MySQL 1062 - 키 'PRIMAY'에 대한 항목 '0'이 중복
MySQL 버전 5.5.24에 다음 테이블이 있습니다.
DROP TABLE IF EXISTS `momento_distribution`;
CREATE TABLE IF NOT EXISTS `momento_distribution`
(
`momento_id` INT(11) NOT NULL,
`momento_idmember` INT(11) NOT NULL,
`created_at` DATETIME DEFAULT NULL,
`updated_at` DATETIME DEFAULT NULL,
`unread` TINYINT(1) DEFAULT '1',
`accepted` VARCHAR(10) NOT NULL DEFAULT 'pending',
`ext_member` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`momento_id`, `momento_idmember`),
KEY `momento_distribution_FI_2` (`momento_idmember`),
KEY `accepted` (`accepted`, `ext_member`)
)
ENGINE=InnoDB
DEFAULT CHARSET=latin1;
이것은 다대일 관계에 대한 많은 데이터를 가지고 있습니다.ondelete=restrict그리고.onupdate=restrict.
이제 기존 관계와 데이터를 유지하면서 구조를 변경하고 테이블에 별도의 기본 키를 도입해야 합니다.이를 위해 다음 쿼리를 실행했습니다.
ALTER TABLE `momento_distribution` ADD `id` INT( 11 ) NOT NULL FIRST;
ALTER TABLE `momento_distribution` DROP PRIMARY KEY , ADD PRIMARY KEY ( `id` );
유감스럽게도 다음 오류로 인해 두 번째 쿼리가 실패했습니다.
1062 - 키 'Primary'에 중복된 항목 '0'
누가 그 문제를 지적해 주실 수 있나요?문제는 기존의 관계라고 생각합니다만, 수천 개의 행이 있는 기존의 관계나 데이터를 잃고 싶지 않습니다.데이터를 잃지 않고 이 작업을 수행할 수 있는 방법이 있습니까?
편집: 데이터를 표시하여 새로 만든 열에 값 '0'이 포함되어 있음을 알 수 있습니다.레코드가 중복되어 프라이머리 키를 변경할 수 없는 경우가 있습니다(새로운 프라이머리 키).
8,000개 이상의 행이 있기 때문에 수동으로 변경할 수 없습니다.할당 방법은 없습니까?rowid새로운 프라이머리 키에 접속할 수 있습니까?
기본 키를 자동 증분으로 지정해야 합니다.
CREATE TABLE `momento_distribution`
(
`momento_id` INT(11) NOT NULL AUTO_INCREMENT,
`momento_idmember` INT(11) NOT NULL,
`created_at` DATETIME DEFAULT NULL,
`updated_at` DATETIME DEFAULT NULL,
`unread` TINYINT(1) DEFAULT '1',
`accepted` VARCHAR(10) NOT NULL DEFAULT 'pending',
`ext_member` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`momento_id`, `momento_idmember`),
KEY `momento_distribution_FI_2` (`momento_idmember`),
KEY `accepted` (`accepted`, `ext_member`)
)
ENGINE=InnoDB
DEFAULT CHARSET=latin1$$
아래의 코멘트에 대해서는, 어떻게 생각하십니까?
ALTER TABLE `momento_distribution`
CHANGE COLUMN `id` `id` INT(11) NOT NULL AUTO_INCREMENT,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`id`);
Primary Key는 고유 인덱스이므로 중복이 포함된 경우 열을 고유 인덱스로 할당할 수 없으므로 새 열을 모두 생성해야 할 수 있습니다.
mysql 콘솔에서 다음 쿼리를 수행합니다.
SHOW CREATE TABLE momento_distribution
다음과 같은 선이 있는지 확인합니다.
CONSTRAINT `momento_distribution_FK_1` FOREIGN KEY (`momento_id`) REFERENCES `momento` (`id`)
다를 수도 있어요. 그냥 추측을 해봤을 뿐이에요.'momento_id'와 'momento_idmember'에 모두 외부 키가 있으면 두 개의 외부 키 이름을 얻게 됩니다.다음 단계는 외부 키를 삭제하는 것입니다.다음 쿼리를 실행합니다.
ALTER TABLE momento_distribution DROP FOREIGN KEY momento_distribution_FK_1
ALTER TABLE momento_distribution DROP FOREIGN KEY momento_distribution_FK_2
반드시 외부 키 이름을 에서 얻은 이름으로 변경해 주세요.CREATE TABLE쿼리. 이제 외부 키가 없으므로 기본 키를 쉽게 제거할 수 있습니다.다음을 시도해 보십시오.
ALTER TABLE `momento_distribution` DROP PRIMARY KEY
다음과 같이 필요한 열을 추가합니다.
ALTER TABLE `momento_distribution` ADD `id` INT( 11 ) NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST
또한 이 쿼리는 숫자를 추가하므로 @rowid에 의존할 필요가 없습니다.이제 이전 열에 외부 키를 다시 추가해야 합니다.이를 위해 먼저 다음과 같은 인덱스를 작성합니다.
ALTER TABLE `momento_distribution` ADD INDEX ( `momento_id` )
ALTER TABLE `momento_distribution` ADD INDEX ( `momento_idmember` )
이제 외부 키를 추가합니다.필요에 따라 참조 테이블/컬럼을 변경합니다.
ALTER TABLE `momento_distribution` ADD FOREIGN KEY ( `momento_id`) REFERENCES `momento` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
ALTER TABLE `momento_distribution` ADD FOREIGN KEY ( `momento_idmember`) REFERENCES `member` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
도움이 됐으면 좋겠다.에러가 발생했을 경우는, 참조 테이블의 구조와 에러 코드를 사용해 질문을 편집해 주세요.
기본 키가 있는 필드가 auto increment로 설정되어 있는지 확인합니다.
이 단계는 나에게 완벽하게 작용한다.한번 해봐
- 색인 추가
- 자동 증분 추가
- 기본 키 추가
당신에게도 효과가 있기를 바랍니다.행운을 빌어요
프라이머리 키를 AUTO_INCREMENT로 설정합니다.
저는 프라이머리 필드에 AUTO_INCREMENT를 추가하지 않고 ID 없이 데이터를 삽입했습니다.
AUTO_INCREMENT를 프라이머리 키로 설정합니다.
typeorm migrations API 사용.위의 오류는 id가 자동으로 증가하지 않았기 때문에 typeorm의 API 마이그레이션을 사용하여 id 열을 작성할 때 이 오류를 사용하여 id 열을 설정하십시오. { name: "id", type: "int auto_increment", isPrimary: true }
테이블을 드롭하고 다시 만듭니다.이건 나한테 효과가 있었어.
언급URL : https://stackoverflow.com/questions/12179770/mysql-1062-duplicate-entry-0-for-key-primary
'source' 카테고리의 다른 글
| 1인당 및 연간 수익 계산 방법 (0) | 2022.12.12 |
|---|---|
| Java는 정수 언더플로와 오버플로우를 어떻게 처리하며 어떻게 확인합니까? (0) | 2022.12.12 |
| python 목록 결합 (0) | 2022.12.12 |
| 배열에 대한 라라벨 컬렉션 (0) | 2022.12.12 |
| Javascript의 파일 이름 문자열에서 확장자를 추출하는 방법은 무엇입니까? (0) | 2022.12.12 |