MySQL 1062 – Intrare duplicată ‘0’ pentru cheia ‘PRIMARY’ (Programare, Mysql, Sql, Mysql5)

Kapil Sharma a intrebat.

Am următorul tabel în versiunea 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;

Aceasta are o mulțime de date cu relații de tip mulți-la-unu cu alte două tabele cu ondelete=restrict și onupdate=restrict.

Acum, trebuie să schimb structura și să introduc o cheie primară separată în tabel, păstrând în același timp relațiile și datele existente. Pentru aceasta, am executat următoarea interogare:

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

Din păcate, a doua interogare a eșuat cu următoarea eroare:

1062 – Duplicate entry ‘0’ pentru cheia ‘PRIMARY’.

Poate cineva să îmi indice problema? Cred că problema este relația existentă, dar nu vreau să pierd relația sau datele existente, care au câteva mii de rânduri. Există vreo modalitate de a face acest lucru fără a pierde date?

EDIT:Vizualizând datele, am aflat că coloana nou creată are valoarea „0” în ea. Probabil că acest lucru nu permite modificarea cheii primare din cauza înregistrărilor duplicate (în noua cheie primară)

Am mai mult de 8.000 de rânduri, așa că nu o pot schimba manual. Există vreo modalitate de a atribui rowid la o nouă cheie primară?

Comentarii

  • Editarea dvs. care explică faptul că ați avut o valoare implicită de 0 m-a ajutat. Se pare că, în cazul meu, tabelele mele au fost create (fără un id, luând valoarea implicită 0) înainte de a fi adăugat auto_incrementul –  > Por Wouter Vanherck.
  • Obișnuiam să am aceeași eroare. În cazul meu, problema era că gestionam un tabel nevid. Am rezolvat problema prin TRUNCATE TABLE nume_table și apoi am putut adăuga cheia primară.  > Por franz1.
7 răspunsuri
user1586443

Rulați următoarea interogare în consola mysql:

SHOW CREATE TABLE momento_distribution

Verificați dacă există o linie care arată ceva de genul

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

Poate fi diferit, am pus doar o presupunere despre ce ar putea fi. Dacă aveți un cheie externă atât pe ‘momento_id’ & ‘momento_idmember’, veți obține două nume de chei străine. Următorul pas este să ștergeți cheile străine. Rulați următoarele interogări:

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

Asigurați-vă că schimbați numele cheii străine cu cel pe care l-ați obținut în urma interogării CREATE TABLE interogare. Acum nu mai aveți chei străine, așa că puteți elimina cu ușurință cheile străine. cheie primară. Încercați următoarele:

ALTER TABLE  `momento_distribution` DROP PRIMARY KEY

Adăugați coloana necesară după cum urmează:

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

Această interogare adaugă, de asemenea, numere, astfel încât nu va trebui să depindeți de @rowid. Acum trebuie să adăugați cheia externă înapoi la coloanele anterioare. Pentru aceasta, faceți mai întâi acești indici:

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

Acum adăugați cheile străine. Schimbați tabelul/coloana de referință după cum aveți nevoie:

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 

Sper că vă ajută. Dacă apar erori, vă rugăm să editați întrebarea cu structura tabelelor de referință & codul (codurile) de eroare pe care îl (le) primiți.

Comentarii

  • Mulțumesc @Youthpark, încerc aceste interogări și mă întorc în următoarele 10 minute maxim. Vă mulțumim pentru ajutor. Sunt foarte frustrat de această problemă. –  > Por Kapil Sharma.
  • În caz de orice problemă, veniți cu structura tuturor tabelelor & cu codul de eroare. – user1586443
  • În cele din urmă făcut. Am fost blocat acolo de ieri. Mulțumesc mult. –  > Por Kapil Sharma.
Miroslav

Trebuie să specificați cheia primară ca fiind cu autoincrementare

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

În ceea ce privește comentariul de mai jos, ce ziceți de:

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

O PRIMARY KEY este un index unic, deci dacă conține duplicate, nu puteți atribui coloana ca index unic, deci este posibil să fie nevoie să creați o nouă coloană.

Comentarii

  • Mulțumesc Merca, dar am dat interogarea de mai sus doar ca referință la structura tabelului. Nu creez un tabel nou. Am deja o tabelă cu multe rânduri, așa că doar interogarea de modificare este o opțiune. În prezent, momento_id & momento_idmember sunt chei străine și cheie compozită. Trebuie să le elimin ca cheie primară și să introduc o nouă coloană ca cheie primară. –  > Por Kapil Sharma.
  • Îmi pare rău, dar nici modificarea nu va funcționa. momento_id este deja cheie primară împreună cu momento_idmember. Am nevoie de o nouă coloană ca cheie primară. Verificați postul meu, am adăugat deja coloana cu succes cu interogare ALTER TABLE momento_distribution ADD id INT( 11 ) NOT NULL FIRST;. Acum trebuie să o fac primară. –  > Por Kapil Sharma.
  • O PRIMARY KEY este un index unic, deci dacă conține duplicate, nu puteți atribui coloana ca index unic, deci este posibil să fie nevoie să creați o nouă coloană.  > Por Miroslav.
  • Da, acesta este motivul. Vă rugăm să verificați editarea în întrebarea de la sfârșit. Există @rowid în MySQL. Încerc să o atribui ca valoare. Este posibil? –  > Por Kapil Sharma.
  • Mulțumesc. M-am luptat cu asta. M-a ajutat foarte mult. –  > Por Koushik Das.
RickPat

verificați dacă câmpul dvs. cu cheia primară este setat să se incrementeze automat

Bill Tanthowi Jauhari

acest pas funcționează perfect pentru mine… îl puteți încerca

  1. Adăugați indexarea
  2. Adăugați autoincrementare
  3. Adăugați cheia primară

Sper că funcționează și pentru tine. Mult noroc

Comentarii

  • Pașii sau procesul pentru această metodă ar fi de ajutor. –  > Por Michael G.
Faizan Khalid

Setați PRIMARY KEY ca AUTO_INCREMENT.

Rohit Dubey

Pentru mine, am uitat să adaug AUTO_INCREMENT la câmpul meu primar și am introdus date fără id.

WapShivam

Setați AUTO_INCREMENT la PRIMARY KEY