복붙노트

[SQL] MySQL의 1,062 - 키에 대한 중복 항목을 '0' 'PRIMARY'

SQL

MySQL의 1,062 - 키에 대한 중복 항목을 '0' 'PRIMARY'

나는 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 = 두 개의 다른 테이블과 다 대일 관계와 많은 데이터와의 OnUpdate = 제한하는 제한이있다.

여전히 기존의 관계와 데이터를 유지하면서 지금, 나는, 구조를 변경해야하고 테이블에서 별도의 기본 키를 소개합니다. 이를 위해, 나는 다음과 같은 쿼리를 실행 :

ALTER TABLE  `momento_distribution` ADD  `id` INT( 11 ) NOT NULL FIRST;
ALTER TABLE  `momento_distribution` DROP PRIMARY KEY , ADD PRIMARY KEY (  `id` );

불행하게도, 내 두 번째 쿼리는 다음과 같은 오류로 실패했습니다 :

누군가가 문제가 밖으로 점을 기쁘게 할 수 있습니까? 나는 문제가 기존의 관계라고 생각,하지만 난 수천 개의 행이 기존 관계 또는 데이터를 잃고 싶지 않아. 데이터의 손실없이이 작업을 수행 할 수있는 방법이 있습니까?

편집하다: 데이터를 보면, I는 새롭게 생성 된 열이있는 값 '0'을 갖는 것을 얻었다. 아마이 (새 기본 키)로 인해 중복 레코드에 기본 키를 변경 허용하지 않습니다

내가 수동으로 변경할 수 없습니다, 그래서 나는 8,000 개 이상의 행이. 새로운 기본 키에 할당 ROWID 수있는 방법이 있습니까?

해결법

  1. ==============================

    1.MySQL의 콘솔에서 다음 쿼리를 실행합니다 :

    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
    

    (가) 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 
    

    희망이 도움이. 만약 에러가 난다면, 참조 테이블 & 당신이지고있는 오류 코드 (들)의 구조하시기 바랍니다 편집 질문.

  2. ==============================

    2.당신은 자동 증가 등의 기본 키를 지정해야

    당신은 자동 증가 등의 기본 키를 지정해야

    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`);
    

    기본 키는 중복을 포함 그렇다면 당신은 모두 새 열을 만들어야 할 수 있도록, 당신이, 고유 인덱스로 열을 할당 할 수 없습니다, 고유 인덱스

  3. ==============================

    3.기본 키와 필드가 자동 증가로 설정되어 있는지 확인

    기본 키와 필드가 자동 증가로 설정되어 있는지 확인

  4. ==============================

    4.완벽하게 나를 위해이 단계의 작업 .. 당신이 그것을 시도 할 수 있습니다

    완벽하게 나를 위해이 단계의 작업 .. 당신이 그것을 시도 할 수 있습니다

    너무 당신을 위해 일하겠습니다. 행운을 빕니다

  5. ==============================

    5.AUTO_INCREMENT 같은 PRIMARY KEY를 설정합니다.

    AUTO_INCREMENT 같은 PRIMARY KEY를 설정합니다.

  6. ==============================

    6.나를 위해, 나는 ID없이 데이터 내 기본 필드에 삽입 AUTO INCREMENT을 추가하는 것을 잊지.

    나를 위해, 나는 ID없이 데이터 내 기본 필드에 삽입 AUTO INCREMENT을 추가하는 것을 잊지.

  7. ==============================

    7.PRIMARY KEY로 설정 AUTO INCREMENT

    PRIMARY KEY로 설정 AUTO INCREMENT

  8. from https://stackoverflow.com/questions/12179770/mysql-1062-duplicate-entry-0-for-key-primary by cc-by-sa and MIT license