Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922

    [Mysql] Replace e unique index. Sintassi.

    Sebbene abbia letto il manuale non riesco a capire la sintassi per fare un replace di un campo definito come unique.
    Se ad esempio ho una tabella del genere

    codice:
    id  campo1   campo2   indice
    1     ...         ......   
    2
    3                      2
    4                      1
    5
    6                      3
    come faccio a fare in modo che l'indice con valore 2 diventi, ad esempio il record con id 1?

  2. #2
    ehhh si... allora non hai capito il replace

    REPLACE non e' altro che un DELETE seguito da un INSERT.

    Se un campo id chiave primaria, oppure un campo indice UNIQUE trova la corrispondenza "allora" il recordo corrispondente viene cancellato e sostituito dal contenuto di REPLACE.

    Ma... se l'indice era autoincrement verra' assegnato un nuovo id esattamente come per in INSERT, perche' di insert si tratterebbe. A che serve? serve a "sostituire" il contenuto degli altri campi evitando di creare un nuovo record nel caso le chiavi corrispondenti fossero gia' esistenti. in realta' cancella e riscrive. infatti le righe alterate sono due.
    .

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Originariamente inviato da piero.mac
    ehhh si... allora non hai capito il replace
    questo è fuori di dubbio.
    non l'avevo mai utilizzato.

    REPLACE non e' altro che un DELETE seguito da un INSERT.
    Se un campo id chiave primaria, oppure un campo indice UNIQUE trova la corrispondenza "allora" il recordo corrispondente viene cancellato e sostituito dal contenuto di REPLACE.
    Ah ecco. Infatti tutto quel che sono riuscito a ottenere finora sono stati o errori di sintassi oppure l'assegnazione dell'indice a un altro id però con la cancellazione del record precedente.

    Ma... se l'indice era autoincrement verra' assegnato un nuovo id esattamente come per in INSERT, perche' di insert si tratterebbe. A che serve? serve a "sostituire" il contenuto degli altri campi evitando di creare un nuovo record nel caso le chiavi corrispondenti fossero gia' esistenti. in realta' cancella e riscrive. infatti le righe alterate sono due.
    Assodata la mia ignoranza, come mi consigli di agire per risolvere il mio problema?
    Devo fare due query?

  4. #4
    ps....

    non l'ho scritto perche' e' scontato, se non trova corrispondenza di chiavi si comporta come un INSERT e aggiunge un record nuovo.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Originariamente inviato da nicola75ss
    Assodata la mia ignoranza, come mi consigli di agire per risolvere il mio problema?
    Devo fare due query?
    credo che devi riconsiderare quanto hai scritto nel primo post.

    c'e' confusione tra "indice" e "id". Se id e' la chiave primaria, devi cambiare il contenuto del campo "indice" con un update. Se "indice" e' un campo UNIQUE devi prima renderlo univoco.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Originariamente inviato da piero.mac
    credo che devi riconsiderare quanto hai scritto nel primo post.

    c'e' confusione tra "indice" e "id". Se id e' la chiave primaria, devi cambiare il contenuto del campo "indice" con un update. Se "indice" e' un campo UNIQUE devi prima renderlo univoco.
    esatto, id è la chiave primaria. indice è un campo unique intero. Scusa se ti faccio domande che a te sembreranno cose ovvie ma cosa intendi per renderlo univoco, il fatto che sia unique non lo rende già tale?

  7. #7
    Originariamente inviato da nicola75ss
    esatto, id è la chiave primaria. indice è un campo unique intero. Scusa se ti faccio domande che a te sembreranno cose ovvie ma cosa intendi per renderlo univoco, il fatto che sia unique non lo rende già tale?
    certo, ma non e' detto lo sia il valore che vuoi inserire. Hai fatto l'esempio di un valore unique "2" da spostare all'id 1. Per farlo devi prima rimuovere/modificare il valore "2" da dove si trova, altrimenti l'UPDATE di rendera' l'errore per campo duplicato.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Quindi dovrei fare ogni volta:

    1) una select che mi ricerchi se il valore che voglio inserire è associato ad un altro record
    2) in caso positivo eliminare il valore indice. edit (update)
    3) procedere al nuovo inserimento. edit (update)

    avevo completamente frainteso il senso del replace. ero convinto che fosse in grado di fare queste tre operazioni in un sol colpo ma se mi dici che non c'è altro modo procederò così.

  9. #9
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Originariamente inviato da piero.mac
    credo che devi riconsiderare quanto hai scritto nel primo post.
    Hai ragione, dopo la tua spiegazione mi son riletto il tutto ed era spiegato chiaramente il funzionamento del replace.
    Non avevo capito un benemerito... Mea culpa.
    Ultima cosa, devo procedere come ho scritto sopra?

  10. #10
    Originariamente inviato da nicola75ss
    Ultima cosa, devo procedere come ho scritto sopra?
    bisognerebbe capire perch'e devi spostare un campo chiamato "indice" e per quale ragione questo debba essere unique. Altro da capire sarebbe perche' questo campo unique "debba" essere associato ad un determinato id.

    Se parti dal principio che un id chiave primaria identifica un record, significa che non dovrebbe identificare anche il contenuto dei campi, ma solo il record stesso nel suo insieme. Ora chi veramente identifica "il contenuto" e' il campo "indice" (parliamo del tuo caso) e dovrebbe essere indifferente al contenuto a quale id chiave primaria sia collegato.

    In altre parole... con REPLACE e lasciando NULL l'id identifichi un record con un campo indice unique specifico, se trova il valore richiesto , cancella il record e ne inserisce uno nuovo con stesso valore unique, nuovi contenuti degli altri campi e nuovo id chiave primaria autoincrement. Se non lo trova questo valore si limita ad inserire un nuovo record.

    Se tu hai l'esigenza di inserire il tuo valore in un campo unique di uno specifico id allora devi fare come hai detto, ma dovresti spiegarmi perche' ti sia indifferente l'id nel caso di inserimento di nuovo record. A rigor di logica dovrebbe esserti indifferente anche se il record venisse identificato, cancellato e sostituito con nuovo.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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.