Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    412

    MySQL, in una tabella ci sono due colonne UNIQUE, si può applicare l'ON DUPLICATE KEY in maniera distinta?

    Ho una tabella utenti_attesa_conferma formata da svariati campi tra cui mail e idUtente, entrambi settati su UNIQUE. Nessuno dei due è una chiave primaria, tuttavia entrambi si suppone che sono univoci e non possono avere duplicati all'interno della stessa tabella.
    C'è poi il problema che non posso combinarli tra loro per formare un'unica key in quanto mail e idUtente non sono strettamente collegate, infatti le operazioni che mi serve fare sono:
    1) devo controllare l'esistenza della mail, e se esiste devo updatare il campo idUtente
    2) se non esiste la mail devo controllare l'esistenza dell'idUtente, se esiste devo updatare il campo Mail
    3) se non esiste né la mail né l'idUtente devo inserire i dati in un record del tutto nuovo.

    Devo necessariamente fare tre query distinte? La clausola ON DUPLICATE KEY agisce soltanto sulla chiave primaria giusto? Non c'è un qualcosa di analogo che mi permetta di fare l'on duplicate si qualsiasi colonna e conoscere poi quale colonna risulta essere duplicata?

  2. #2
    insert .... on duplicate key update
    agisce sui campi che generano un errore in caso di duplicazione non permessa e quindi primary e unique key.

    http://dev.mysql.com/doc/refman/5.5/...duplicate.html

    Quindi se trova un campo unique duplicato esegua di conseguenza l'update. Solitamente il primo che trova e' quello che fisicamente e' descritto per primo nella tabella.

    A pensarci non credo che tu possa eseguire contemporaneamente il controllo su piu' campi ed aggiornare il mancante/diverso dei due campi unique.

    Guardando il manuale dovrebbe funzionare cosi':
    codice:
    insert into tab (campo1, campo2, campo3)
    values (1, 2 ,3)
    on duplicate key update campo3 = 'qualcosa'
    
    -- corrisponderebbe a
    
    update tab set campo3 = 'qualcosa' 
    where campo1 = 1 and campo2 = 2
    Quindi i valori unique nell'update si troverebbero nel where e non nel set.

    Pero' mi chiedo come possa esistere un utente senza id_utente.... una Email puo' essere sostituita l'id_utente direi di no. Se poi devi anche conoscere quale campo risulta duplicato credo che tu debba fare prima una query SELECT, valutare il contenuto ed applicare la insert o update appropriato.

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

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    412
    Il fatto è che utilizzo la stessa tabella sia per la fase di registrazione che per la fase in cui un utente già registrato voglia modificare l'indirizzo mail.
    Considerando che in entrambi i casi sono mail che vanno convalidate, ho pensato di metterle nella stessa tabella senza distinzione.
    Avrei quindi i seguenti tipi di scenari;

    1) L'utente si registra e nel DB memorizzo la mail della quale si aspetta la convalida. A questo punto ovviamente l'idUtente ancora non esiste quindi resta vuoto il campo.
    2) Un utente già registrato tenta di modificare la sua mail. L'idUtente già potrebbe essere presente nella tabella in quanto magari egli ha tentato più volte di modificare la sua mail. Per evitare appunto che inzozzi il DB non creo un nuovo record per ogni sua richiesta, ma updato quello vecchio (basandomi sull'idUtente).
    Potrebbe altresì verificarsi che sia effettivamente la prima volta che l'utente tenta di modifcare la mail, quindi il suo ID giustamente non appare nella tabella. TUTTAVIA la nuova mail che desidera attivare è già presente nel DB. In che modo? Ad esempio qualcuno in passato ha già tentato la registrazione con quel medesimo indirizzo senza convalidarlo, indirizzo che quindi risulta essere in balia all'interno della tabella. Poco male, quel che devo fare è solo updatare il campo idUtente dove tale mail appare.
    Ultima modifica di American; 31-10-2013 a 03:08

  4. #4
    direi che i scenari potrebbero essere:

    utente non convalidato: manca l'id_utente, ma ci sara' di certo una email (unica) dove hai spedito la convalida ed un campo di controllo valido si/no o 0/1, puo' servire anche per il ban 0/1/2. Ovviamente dovrai gestire il record tramite l'id_record

    utente convalidato: DEVE avere assegnato il suo id_utente con indice UNIQUE (ma potrebbe pure essere la chiave primaria), deve avere una Email valida con il controllo valido = si

    Utente valido vuole cambiare la Email. di certo troverai il record da modificare tramite l'id_utente registrato. Se la Email e' doppiona avrai un errore

    In solido se e' un nuovo utente INSERT, se vuole modificare UPDATE. Non puoi certo fare la scelta del se c'e' aggiorno se non c'e' lo metto. Se noti nei siti dove esiste la richiesta del log utente troverai due form: accedi e registrati.

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

  5. #5
    http://dev.mysql.com/doc/refman/5.6/...duplicate.html

    "In general, you should try to avoid using an ON DUPLICATE KEY UPDATE clause on tables with multiple unique indexes."

    Insomma: in teoria puoi, in pratica oltre a essere concettualmente un po' astruso, loro lo sconsigliano, e quindi non hai la certezza che funzioni bene.
    REPLACE funziona, ma non so se nel tuo caso va bene (come saprai sono due istruzioni molto diverse).
    STK/Unit: Unit Test framework per MariaDB
    http://stk.wikidot.com/stk-unit

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 © 2026 vBulletin Solutions, Inc. All rights reserved.