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:
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?1062-duplikat wpisu "0" for key "PRIMARY"
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?
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.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
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
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ć
- Dodaj indeks
- Dodaj Autoincrement
- Dodaj Klucz Podstawowy
Mam nadzieję, że to zadziała również dla Ciebie. powodzenia
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.
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.
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
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