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ă?
- 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.
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.
- 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ă. – > .
- Î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. – > .
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ă.
- 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ă. – > .
- Îmi pare rău, dar nici modificarea nu va funcționa.
momento_id
este deja cheie primară împreună cumomento_idmember
. Am nevoie de o nouă coloană ca cheie primară. Verificați postul meu, am adăugat deja coloana cu succes cu interogare ALTER TABLEmomento_distribution
ADDid
INT( 11 ) NOT NULL FIRST;. Acum trebuie să o fac primară. – > . - 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ă. > .
- 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? – > .
- Mulțumesc. M-am luptat cu asta. M-a ajutat foarte mult. – > .
verificați dacă câmpul dvs. cu cheia primară este setat să se incrementeze automat
acest pas funcționează perfect pentru mine… îl puteți încerca
- Adăugați indexarea
- Adăugați autoincrementare
- Adăugați cheia primară
Sper că funcționează și pentru tine. Mult noroc
- Pașii sau procesul pentru această metodă ar fi de ajutor. – > .
Setați PRIMARY KEY ca AUTO_INCREMENT.
Pentru mine, am uitat să adaug AUTO_INCREMENT la câmpul meu primar și am introdus date fără id.
Setați AUTO_INCREMENT la PRIMARY KEY