MySQL 1062-Duplicate entry ' 0 'for key 'PRIMARY'

Mam następującą tabelę w MySQL w wersji 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;

Posiada wiele danych z relacjami many-to-one z dwoma innymi tabelami z ondelete=restrict i onupdate=restrict.

Teraz muszę zmienić strukturę i wprowadzić oddzielny klucz podstawowy w tabeli, zachowując jednocześnie istniejące relacje i dane. W tym celu wykonałem następujące zapytanie:

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

Niestety, moje drugie zapytanie nie powiodło się z następującym błędem:

1062-duplikat wpisu "0" for key "PRIMARY"

Czy ktoś może zwrócić uwagę na problem? Myślę, że problemem jest istniejąca relacja, ale nie chcę stracić istniejącej relacji lub danych, które mają kilka tysięcy wierszy. Czy jest jakiś sposób, aby to zrobić bez utraty danych?

EDIT: Przeglądając dane otrzymałem, że nowo utworzona kolumna ma w sobie wartość '0'. Prawdopodobnie nie pozwala to na zmianę klucza głównego z powodu zduplikowanych rekordów (w Nowym kluczu głównym)

Mam więcej niż 8000 wierszy, więc nie mogę tego zmienić ręcznie. Czy jest jakiś sposób na przypisanie rowid do nowego klucza podstawowego?

Author: ReinstateMonica3167040, 2012-08-29

7 answers

Uruchom następujące zapytanie w konsoli mysql:

SHOW CREATE TABLE momento_distribution

Sprawdź linię, która wygląda jak

CONSTRAINT `momento_distribution_FK_1` FOREIGN KEY (`momento_id`) REFERENCES `momento` (`id`)

Może być inaczej, tylko zgaduję, co to może być. Jeśli masz klucz obcy na obu "momento_id" i "momento_idmember", otrzymasz dwie nazwy kluczy obcych. Następnym krokiem jest usunięcie kluczy obcych. Uruchom następujące zapytania:

ALTER TABLE momento_distribution DROP FOREIGN KEY momento_distribution_FK_1
ALTER TABLE momento_distribution DROP FOREIGN KEY momento_distribution_FK_2

Pamiętaj, aby zmienić nazwę klucza obcego na tę, którą otrzymałeś Z zapytania CREATE TABLE. Teraz nie posiadaj dowolne klucze obce, dzięki czemu możesz łatwo wyjąć Klucz podstawowy. Spróbuj:

ALTER TABLE  `momento_distribution` DROP PRIMARY KEY

Dodaj wymaganą kolumnę w następujący sposób:

ALTER TABLE  `momento_distribution` ADD  `id` INT( 11 ) NOT NULL  PRIMARY KEY AUTO_INCREMENT FIRST

To zapytanie dodaje również liczby, więc nie musisz polegać na @rowid. Teraz musisz dodać klucz obcy z powrotem do wcześniejszych kolumn. W tym celu najpierw wykonaj te indeksy:

ALTER TABLE  `momento_distribution` ADD INDEX (  `momento_id` )
ALTER TABLE  `momento_distribution` ADD INDEX (  `momento_idmember` )

Teraz dodaj klucze obce. Zmień tabelę/kolumnę odniesienia według potrzeb:

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 
Mam nadzieję, że to pomoże. Jeśli pojawią się jakieś błędy, proszę edytować pytanie o strukturę tabel referencyjnych i Kod(y) błędów, które otrzymujesz.
 24
Author: Félix Gagnon-Grenier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-17 16:08:15

Musisz określić klucz podstawowy jako auto-increment

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$$

W odniesieniu do komentarza poniżej, co powiesz na:

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

Klucz podstawowy jest unikalnym indeksem, więc jeśli zawiera duplikaty, nie możesz przypisać kolumny do unikalnego indeksu, więc może być konieczne utworzenie nowej kolumny w ogóle

 63
Author: Miroslav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-29 15:13:01

Sprawdź, czy pole z kluczem głównym jest ustawione na auto increment

 14
Author: RickPat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-05 20:14:06

Ten krok działa dla mnie idealnie.. możesz spróbować

  1. Dodaj indeks
  2. Dodaj Autoincrement
  3. Dodaj Klucz Podstawowy

Mam nadzieję, że to zadziała również dla Ciebie. powodzenia

 7
Author: Bill Tanthowi Jauhari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-27 09:14:58

Ustaw swój klucz podstawowy jako AUTO_INCREMENT.

 5
Author: Faizan Khalid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-09 03:23:29

Dla mnie zapomniałem dodać AUTO_INCREMENT do mojego pola podstawowego i wstawiłem dane bez id.

 1
Author: Rohit Dubey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-25 11:15:18

Ustaw AUTO_INCREMENT na Klucz podstawowy

 0
Author: WapShivam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-26 08:33:26