[MySQL] Errore importazione tabella .sql #1062 - Duplicate entry '592' for key 'PRIMARY'

Gemma Bonardi

Nuovo Utente
16 Dic 2017
5
0
1
Sto usando il componente IcAgenda su Joomla.
Devo riportare gli eventi da un sito ad un altro.
Da MySQL ho esportato le tabelle della cartella icagenda_events nel formato .sql, ma quando provo ad importarle nella medesima cartella del nuovo sito mi viene restituito il seguente errore:
Errore
Query SQL:
-- -- Dump dei dati per la tabella `jos_icagenda_events` -- INSERT INTO `jos_icagenda_events`...........
Messaggio di MySQL: Documentazione
#1062 - Duplicate entry '592' for key 'PRIMARY'

Le tabelle di IcAgenda sono completamente vuote essendo il sito nuovo.
Ho provato a importare la jos_icagenda_events.sql varie volte (sia in icagenda che in icagenda_events), ma restituisce sempre il medesimo errore.
Se vado dentro al file jos_icagenda_events.sql e cancello la riga 592, al tentativo successivo mi genera l'errore per la 591.

Dipende forse dal fatto che il file .sql provenga da altro database?
Devo cambiare qualcosa al suo interno per renderlo commestibile al nuovo db?
Tra l'altro, il vecchio db era su register, mentre il nuovo su aruba.

Allego 2 screens nel caso possano essere utili a chiarire le situazione.
01.jpg 02.jpg
 
ciao
prova a elimiare nella insert l'id
INSERT INTO jos_icacenda_events('ordering', ecc...) VALUES('$valore_di_ordering', ecc...)
probabilmente c'è un conflitto di id unici e autoincrementali.
 
scusami, ti riferisci al file .sql o devo intervenire sul database?

ti riferisci forse a questa parte del file?
PHP:
CREATE TABLE IF NOT EXISTS `jos_icagenda_events` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `ordering` int(11) NOT NULL,
  `state` tinyint(1) NOT NULL DEFAULT '1',
  `checked_out` int(11) NOT NULL,
  `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `title` varchar(255) NOT NULL,
  `alias` varchar(255) NOT NULL,
  `username` varchar(255) NOT NULL,
  `catid` int(11) NOT NULL,
  `image` varchar(255) NOT NULL,
  `file` varchar(255) NOT NULL,
  `dates` mediumtext NOT NULL,
  `next` date NOT NULL,
  `time` varchar(255) NOT NULL,
  `place` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `phone` varchar(255) NOT NULL,
  `name` varchar(255) NOT NULL,
  `city` varchar(255) NOT NULL,
  `address` varchar(255) NOT NULL,
  `coordinate` varchar(255) NOT NULL,
  `desc` mediumtext NOT NULL,
  `params` mediumtext NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=593 ;
 
Ultima modifica di un moderatore:
ciao
scusa pensavo che facessi una INSERT
da che ne so non dovresti creare la tabella di destinazione, quando fai l'export .sql la tabella è completa(nome dei campi+loro valore), quindi quando fai l'inport nel db la tabella si genera completamente da se (nome dei campi+loro valore) quindi non ti serve il CREATE TABLE cioè creare una tabella e fare l'inport.
 
Allora il file che ho generato con l'export è così composto (allego sotto in viola):
Se lo importo così com'è mi dà errore, cosa dovrei variare quindi?
PHP:
-- phpMyAdmin SQL Dump
-- version 3.3.7deb6
-- http://www.phpmyadmin.net
--
-- Host: hostingmysql240
-- Generato il: 10 dic, 2017 at 02:40 PM
-- Versione MySQL: 5.5.52
-- Versione PHP: 5.2.6-1+lenny16

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `xxx_252c5`
--

-- --------------------------------------------------------

--
-- Struttura della tabella `jos_icagenda_events`
--

CREATE TABLE IF NOT EXISTS `jos_icagenda_events` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `ordering` int(11) NOT NULL,
  `state` tinyint(1) NOT NULL DEFAULT '1',
  `checked_out` int(11) NOT NULL,
  `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `title` varchar(255) NOT NULL,
  `alias` varchar(255) NOT NULL,
  `username` varchar(255) NOT NULL,
  `catid` int(11) NOT NULL,
  `image` varchar(255) NOT NULL,
  `file` varchar(255) NOT NULL,
  `dates` mediumtext NOT NULL,
  `next` date NOT NULL,
  `time` varchar(255) NOT NULL,
  `place` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `phone` varchar(255) NOT NULL,
  `name` varchar(255) NOT NULL,
  `city` varchar(255) NOT NULL,
  `address` varchar(255) NOT NULL,
  `coordinate` varchar(255) NOT NULL,
  `desc` mediumtext NOT NULL,
  `params` mediumtext NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=593 ;

--
-- Dump dei dati per la tabella `jos_icagenda_events`
--

INSERT INTO `jos_icagenda_events` .....
INSERT INTO `jos_icagenda_events` .....
INSERT INTO `jos_icagenda_events` .....
 
Ultima modifica di un moderatore:
Ciao Gemma.
Da regolamento del forum, come tutti noi sei tenuta ad usare il tag
code.gif
quando posti del codice, oppure la funzione codice dalla barra degli strumenti
box inserisci 2.png.JPG

Inoltre ti prego di leggere attentamente il regolamento generale del forum e quello di sezione dove posti
Grazie
Per questa volta te lo sistemo io ma mi raccomando per il futuro

ciao.gif
ciao.gif
 
prova a creare la tabella omettendo
"AUTO_INCREMENT" e
",
PRIMARY KEY (`id`)"
attenta alla virgola sulla riga precedente

importa i dati, non dovrebbe più darti errore
esegui questa query, se il risultato è corretto non lista niente
a riprova sostituisci ">" con "=" deve dare una lista con counter = 1
Codice:
select * from (
select id, count(id) counter
from jos_icagenda_events
group by id
) t
where counter > 1
non scordare la "t" dopo la parentesi chiusa

se tutto ok, modifica la colonna con il comando
Codice:
ALTER TABLE jos_icagenda_events
MODIFY COLUMN id
INT(11) unsigned
NOT NULL
AUTO_INCREMENT
PRIMARY KEY;
non so se funziona, non conosco mysql e non posso provarlo,
fai sapere
 
Ultima modifica:
ciao
io però non vedo errori nel file sql, è quello che si genera usando phpmyadmin.
ora non so quanti record debbano essere copiati, ma se hai accesso al db originale potresti usare uno script php per trasferire i dati nell'altro db, ti faccio uno schema
PHP:
$con_origine=mysqli_connect($host_origine,$user_origine,$pass_origine, $db_origine) or die (mysql_error());
$con_destinazione=mysqli_connect($host_destinazione,$user_destinazione,$pass_destinazione, $db_destinazione) or die (mysql_error());
//crei la tabella jos_icagenda_events
//non metto tutti i dati
$crea_dest=mysqli_query($con_destinazione,
    "CREATE TABLE IF NOT EXISTS jos_icagenda_events(
    id int(11) unsigned NOT NULL AUTO_INCREMENT,
    ordering int(11) NOT NULL,
    state tinyint(1) NOT NULL DEFAULT 1,
    checked_out int(11) NOT NULL,
    PRIMARY KEY (id) ENGINE = InnoDB;
    )");
//togli i batik
//poi fai una select su origine
$query_origine=mysqli_query($con_origine, "SELECT * FROM nome_tab_origine");
while($riga=mysqli_fetch_assoc()){
    $ordering=$riga['ordering'];
    $state=$riga['state'];
    $checked_out=$riga['checked_out'];
    //tutti gli altri
    //e fai l'insert
    $query_dest=mysqli_query($con_destinazione,
    "INSERT INTO jos_icagenda_events(ordering,state,checked_out) VALUES($ordering,$state,checked_out)");

}
mysqli_close($con_origine);
mysqli_close($con_destinazione);
potrebbe essere una soluzione alternativa
 
@borgo italia , @Gemma Bonardi
attenzione però nel trasferimento,

se "id" è usato per la join tra tabelle e assolutamente necessario avere quello originale
altrimenti il database sarà inconsistente ...

se la copia è limitata ad una tabella, nessun problema (ma non mi sembra sia questo il caso)

questo motiva il mio suggerimento
 
ciao
si hai ragione si creano degli id nuovi, eventualmente per legare le due tabelle nella destinazione si può aggiungere il campo id_origine.
comunque quello che non capisco è perchè dia quell'errore nell'inport, talvolta ho usato anch'io l'export/inport senza problemi
 
si hai ragione si creano degli id nuovi, eventualmente per legare le due tabelle nella destinazione si può aggiungere il campo id_origine
ma così devi modificare tutte le applicazioni che avessero join al loro interno,
ed intervenire sul db per le modifiche

inoltre l'indice origine dovrebbe essere gestito dalle applicazioni, un nuovo record deve recuperare l'id e successivamente con un'update aggiornare il secondo campo.....

meglio disattivare la numerazione automatica ed attivarla successivamente


potresti fare una prova con 10 records,
esporti,
scambi la posizione del record 3 con quello del record 7 (nel file 1-2-7-4-5-6-3-8-9-10)
importi
e vedi l'effetto che fa ...
 
ciao
come detto quello che non capisco è perchè dia quell'errore, sono andato a rivedermi mie file sql di cui avevo fatto l'export/inport e sono (a parte i nomi dei campi e valori) simile a quello postato da @Gemma Bonardi
 
ciao
Metto a confronto un mio sql con quello postato

sql.jpg

quello che noto e quello che mi fa venire un grosso dubbio è che nell'sql di @Gemma Bonardi risultano TRE INSERT se è così è logico che dia quell'errore, esempio
al primo INSERT mette id=5
al secondo cerca di mettere un'altro id=5 da cui ERRORE
quindi prima dell'inport prova a modificare l'sql eliminando due INSERT
anche se non capisco perchè ti risultino 3 INSERT
 
risultano TRE INSERT se è così è logico che dia quell'errore
se noti auto_increment dice di partire da 54 per il tuo mentre il secondo 593
potrebbe essere che crei set di dati (insert) limitati per evitare problemi nella loro gestione

anch'io ho sviluppato un sistema di esportazione delle tabelle da database e creo insert con blocchi da 50 record

@Gemma Bonardi
per cortesia esegui questa query sulla tabella originale, prima dell'esportazione
Codice:
select * from (
select id, count(id) counter
from jos_icagenda_events
group by id
) t
where counter > 1
è un semplice controllo, vedi sopra nel post precedente
 
puoi provare anche la soluzione più banale,
ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1000
sostituisci 593 con 1000
fai sapere
 

Discussioni simili