2012-08-29 9 views
25

Mam poniższej tabeli w wersji MySQL 5.5.24MySQL 1062 - Powielanie pozycję „0” na klucz „pierwotna”

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; 

Ma wiele danych z wielu do jednej relacji z pozostałych dwóch tabel z ondelete=restrict i onupdate=restrict.

Teraz potrzebuję zmienić strukturę i wprowadzić oddzielny klucz podstawowy w tabeli, zachowując jednocześnie istniejące relacje i dane. Za to, że wykonał 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 powodu następującego błędu:

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

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

EDYCJA: Przeglądając dane, dostałem, że nowo utworzona kolumna ma w sobie wartość "0". Prawdopodobnie nie pozwala to na zmianę klucza głównego z powodu duplikatów rekordów (w nowym kluczu podstawowym)

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

Odpowiedz

13

Uruchom następujące zapytanie w konsoli mysql:

SHOW CREATE TABLE momento_distribution 

Sprawdź na linii, która wygląda mniej więcej tak

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

To może być inny, po prostu położyć się domyślać, co to może być. Jeśli masz numer foreign key zarówno "momento_id" & "momento_idmember", otrzymasz dwie nazwy kluczy obcych. Następnym krokiem jest usunięcie obcych kluczy. Uruchom następujące pytania:

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 do co masz z kwerendy CREATE TABLE. Teraz nie masz żadnych obcych kluczy, więc możesz łatwo usunąć primary key. Spróbuj wykonać następujące czynności:

ALTER TABLE `momento_distribution` DROP PRIMARY KEY 

Dodaj wymaganą kolumnę następująco:

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

Ta kwerenda dodaje również numery, dzięki czemu nie trzeba będzie zależeć od @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ę referencyjną/kolumnę zgodnie z potrzebami:

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 

Nadzieję, że pomaga. Jeśli pojawią się jakieś błędy, edytuj pytanie ze strukturą tabel referencyjnych & kodów błędów, które otrzymujesz.

+0

Dzięki @Youthpark, próbuję tych zapytań i wracam za następne 10 minut. Dzięki za pomoc. Naprawdę jestem sfrustrowany tym problemem. –

+1

W przypadku jakiegokolwiek problemu dołącz strukturę wszystkich tabel i kod błędu. –

+1

Wreszcie zrobione. Utknąłem tam od wczoraj. Wielkie dzięki. –

43

musisz określić klucz podstawowy w postaci automatycznego przyrostu

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 uwag poniżej, jak o:

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

klucz podstawowy jest unikalny indeks, więc jeśli zawiera duplikaty, nie można przypisać kolumny do unikatowego indeksu, więc może być konieczne utworzenie nowej kolumny w całości

+0

Dzięki Merca, ale podałem powyższe zapytanie jako odniesienie do struktury tabeli. Nie tworzę nowego stołu. Mam już tabelę z dużą ilością wierszy, więc opcja "tylko zmień zapytanie". Obecnie momento_id i momento_idmember to klucze obce i klucz złożony. Muszę usunąć je jako klucz podstawowy i wprowadzić nową kolumnę jako klucz podstawowy. –

+0

Niestety, edycja również nie zadziała. 'momento_id' jest już kluczem podstawowym razem z' momento_idmember'. Potrzebuję nowej kolumny jako klucza podstawowego. Sprawdź mój wpis, dodałem już kolumnę pomyślnie z zapytaniem ** ALTER TABLE 'momento_distribution' ADD' id' INT (11) NOT NULL FIRST; **. Teraz musisz zrobić to jako podstawowy. –

+0

Klucz podstawowy jest unikalnym indeksem, więc jeśli zawiera duplikaty, nie można przypisać kolumny do unikatowego indeksu, więc może być konieczne utworzenie nowej kolumny w całości – Miroslav

9

sprawdzić, czy pole klucza podstawowego jest ustawione na auto przyrostu

1

ta praca krok idealnie dla mnie .. można spróbować go

  1. Dodaj indeksowanie
  2. Dodaj autoIncrement
  3. Dodaj Klucz podstawowy

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

Powiązane problemy