Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [MYSQL] copia degli ID originali in un restore

    Non so se è questo il posto giusto per questo quesito perchè dovrei poter risolvere un problema MYSQL in ambiente PHP.

    Da buon profano fintanto lavoro con una singola tabella o con una serie di tabelle autonome eseguo il Backup ed il relativo Restore servendomi di un normale file di testo.
    Con tali tabelle la numerazione degli ID è ininfluente.

    Il problema mi si pone lavorando con 2 o più tabelle relazionate tra loro tramite ID.
    Dopo un po' di tempo di lavorazione le tabelle presentano la sequenza degli ID bucata come in questo piccolo esempio (gli ID di ciascuan tabella sono di tipo int(10) -PRI - auto_increment)

    codice:
    table1						table2
    id	nome		cognome			id	id_table1	città
    3	Maggi		Massimo			1	6		Codena
    6	Edelvisi	Maurizio		2	9		Tornata
    7	Gerardini	Silvano			3	7		Besenzone
    9	Pasotti		Alessio			8	11		Codena
    11	Calvi		Giovanni		10	3		Basaluzzo
    12	Poggi		Giuseppe		11	18		Raccuja
    18	Curti		Oreste			15	12		Braulins
    Eseguendo il restore con delle normali "INSERT INTO" questi buchi che scompaiono mi causano problemi:

    codice:
    table1						table2
    id	nome		cognome			id	id_table1	città
    1	Maggi		Massimo			1	6		Codena
    2	Edelvisi	Maurizio		2	9		Tornata
    3	Gerardini	Silvano			3	7		Besenzone
    4	Pasotti		Alessio			4	11		Codena
    5	Calvi		Giovanni		5	3		Basaluzzo
    6	Poggi		Giuseppe		6	18		Raccuja
    7	Curti		Oreste			7	12		Braulins
    I record della seconda tabella che hanno una relazione con quelli della prima tabella, dopo questa operazione, perdono il giusto riferimento.

    La richiesta a questo punto è questa:
    in alcuni esempi leggo:
    codice:
    /*!40000 ALTER TABLE `votelanguage` DISABLE KEYS */;
    LOCK TABLES `votelanguage` WRITE;
    INSERT INTO ..................
    UNLOCK TABLES;
    /*!40000 ALTER TABLE `votelanguage` ENABLE KEYS */;
    Immagino che "DISABLE KEYS" serva a bloccare gli "auto_increment" degli ID.
    E' possibile metterla in una istruzione PHP?
    E come faccio ad inserirla come Query in una istruzione PHP?

    Vi ringrazio per l'attenzione

  2. #2

  3. #3
    sob! Non c'è soluzione per il problema!

  4. #4
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Non c'è nessun bisogno di "bloccare" gli auto increment.
    Se tu nella insert metti tutti i valori, compreso l'id, in tabella ci andrà quello. Non capisco dove sia il problema.

    L'esempio che hai citato serve a velocizzare gli inserimenti di massa, evitando l'aggiornamento degli indici dopo ogni insert

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    da quanto posso "intuire" hai importato come chiave in altre tabelle un campo autoincrementante e, facendone il restore, si "fotte".

    Risposta: per quanto ne so non c'è modo di evitarlo (durante il restore puoi impostare qual'è il primo # per l'autoincremento).

    Devi utilizzare una chiave esterna che NON sia su un campo autoincrementante; puoi "brutalmente" chiamarlo ID e popolarlo pari alla chiave autoincrementante (da programma o da trigger, meglio da programma)

    In questo modo il restore non ti "fotterà" il campo seriale. Dovrai far attenzione, semmai, a far iniziare il conteggio autoinc da >max(id), ma non è difficile

  6. #6
    Ti ringrazio franzauker
    forse la tua è la miglior soluzione: collegare record di tabelle collegate non usando l'id autoincrementante ma un altro campo arbitrario ma univoco.
    So che è possibile creare un secondo campo univoco non autoincrementante per evitare di inserire dati duplicati. Quindi vedrò come fare e usare questo come chiave di collegamento tra tabelle collegate.

    Di nuovo grazie per la risposta e....alla prossima.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Originariamente inviato da micdas
    Ti ringrazio franzauker
    forse la tua è la miglior soluzione: collegare record di tabelle collegate non usando l'id autoincrementante ma un altro campo arbitrario ma univoco.
    So che è possibile creare un secondo campo univoco non autoincrementante per evitare di inserire dati duplicati. Quindi vedrò come fare e usare questo come chiave di collegamento tra tabelle collegate.

    Di nuovo grazie per la risposta e....alla prossima.
    più semplicemente ti suggerisco uno schema
    SER (chiave primaria autoincrementante)
    ID (intero copiato da SER al momento della creazione della riga)

    Altrimenti ci sono metodi diversi, ossia quello di generare (lato applicazione) una chiave "vera" (soluzione certamente più pulita)

  8. #8
    Originariamente inviato da franzauker
    più semplicemente ti suggerisco uno schema
    SER (chiave primaria autoincrementante)
    ID (intero copiato da SER al momento della creazione della riga)

    Altrimenti ci sono metodi diversi, ossia quello di generare (lato applicazione) una chiave "vera" (soluzione certamente più pulita)
    Grazie ancora franzauker
    La formula
    SER (chiave primaria autoincrementante)
    ID (intero copiato da SER al momento della creazione della riga)
    sarebbe un tantinello macchinoso in quanto, durante la registrazione della query, dovrei rilevare il valore autoincrement per inserirlo nelle 2 tabelle implicate.
    La seconda sarebbe più semplice da gestire perchè estraneo alla registrazione del valore autoincrement ignoto al momento di eseguire l'operazione.
    Che diresti di usare una delle funzioni PHP microtime o mktime?
    Sarebbero comunque valori univoci e di più facile reperibilità.


  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Originariamente inviato da micdas
    sarebbe un tantinello macchinoso in quanto, durante la registrazione della query, dovrei rilevare il valore autoincrement per inserirlo nelle 2 tabelle implicate.
    ti basta in realtà un trigger
    La seconda sarebbe più semplice da gestire perchè estraneo alla registrazione del valore autoincrement ignoto al momento di eseguire l'operazione.
    Che diresti di usare una delle funzioni PHP microtime o mktime?
    Sarebbero comunque valori univoci e di più facile reperibilità.
    non direi. la chiave deve (dovrebbe) avere una sua logica.
    Se non ho capito male non è altro di diverso da un codiceutente.
    bene, a seconda di quanto è grande la tabella e quanto sono importanti le prestazioni, puoi mettere il CRC della stringa nome+cognome+oracorrente+citta+numerorandom+numero recorddellatabella+nomedell'utenteloggato

    l'uomo saggio,ovviamente, giusto per curiosità dopo aver generato una chiave fa qualcosa tipo select ser from tabella where chiave=qualcosa e se ti torna un recordcount allora hai una collisione
    (non è un granchè, visto concorrenza, transazioni in corso blablabla), ma ti costa poco metterlo

    a te interessa che non vi siano collisioni. Attenzione però, nel caso in cui ti interessino query di intervalli, ma da quanto ho capito non è questo il caso.

    la chiave deve essere breve (per ridurre la dimensione degli indici per i join) e se non hai tanti record puoi fare così.

  10. #10
    Ancora grazie per la pazienza
    Purtroppo sono un tantinello tonto
    Ma potresti dirmi cos'è questo trigger e come reperirlo o generarlo? Proprio non lo so

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.