source

MySQL 1062 - 키 'PRIMAY'에 대한 항목 '0'이 중복

bestscript 2022. 12. 12. 21:14

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로 설정되어 있는지 확인합니다.

이 단계는 나에게 완벽하게 작용한다.한번 해봐

  1. 색인 추가
  2. 자동 증분 추가
  3. 기본 키 추가

당신에게도 효과가 있기를 바랍니다.행운을 빌어요

프라이머리 키를 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