Incremento id di 1

di il
7 risposte

Incremento id di 1

Ciao a tutti,

come mai non mi funziona?
devo incrementare di 1 il campo ID nella tabella

select sum(max(id_candidato)) + sum(1) from candidato;

che cosa ho sbagliato, qual'è quello giusto?

7 Risposte

  • Re: Incremento id di 1

    Valore massimo: max(id_candidato)
    dopo di chè devo fare la somma + 1
    ma senza utilizzare AUTOINCREMENT DI MYSQL CHE NON L'HO VOGLIO UTILIZZARE, VORREI CAPIRE MANUALMENTE IL FUNZIONAMENTO DI INCREMENTO + 1
  • Re: Incremento id di 1

    Non devi usare Sum

    P.s. Non lo voglio... L'italiano...
  • Re: Incremento id di 1

    Da quello che posso vagamente intuire vuoi aumentare un campo intero di 1 unità.
    Ovviamente non è banale farlo, in concorrenza, mentre lo è in situazione singolo utente.

    Quindi cosa vuoi esattamente fare? Simulare un campo autoincrementante, o aumentare di 1 la riga con l'id massimo?
    Nel caso 2
    
    UPDATE candidato SET id_candidato=
    (select massimo+1 from (select max(id_candidato) as massimo from candidato) as d3)
    WHERE id_candidato = (select massimo2 from (SELECT MAX(id_candidato) massimo2 FROM candidato) as d2)
    
    Se invece vuoi porre a MAX(campo)+1 una riga con campo vuoto?
  • Re: Incremento id di 1

    Deve funzionare esattamente come un autoincremento normale nel senso ogni volta che aggiungo i fati, L'ID incrementa di 1.
    Esempio
    Id. Nome
    1. Francesco
    2. Luca
    3. Simone
    Ecc....
    Ogni volta che inserisco qualche dato avanza sempre di 1

    Grazie
  • Re: Incremento id di 1

    Non mi è chiaro perché vuoi fare un gran bordello invece di usare un set.
    per inciso la scelta più logica sarebbe fare una chiave vera da applicazione.
    se proprio vuoi fare allora basta un trigger che incrementi il campo vuoto magari con un lock
  • Re: Incremento id di 1

    Con il set come si fa?
    me l'ho puoi dire gentilmente?
  • Re: Incremento id di 1

    Allora per ordine
    1) se vuoi un campo autoincrementante, la logica è quella di usare un campo autoincrementante (che, però, può essere unico per ogni tabella)
    2) se usi mariadb >=10.3 puoi usare le sequenze (che è quello che vuoi tentare di fare)
    3) in un "mondo normale" non si usano campi autoincrementanti per fare quello che vuoi, ossia una chiave primaria.
    Puoi generarla benissimo da applicazione, anche pseudocausale, e usare quella (* nota: avrai una riduzione delle performances nel caso di chiavi lunghe, di scattering sulle foglie dell'indice se pseudocasuale. direi che se hai un'applicazione di dimensioni risibili e usi la chiave per join 1-1 la cosa non è che ti turbi più di tanto, direi per nulla)
    4) se sei "incaponito" puoi (in via alternativa, ma sono approcci inadatti per applicazioni "serie")
    a) inserire una riga con id vuoto, e poi fare un update che setta al massimo+1 quella con riga vuota (non funziona affidabilmente in concorrenza)
    b) leggere da applicazione il MAX del campo, e quando fai l'insert scrivere il massimo +1 (non funziona affidabilmente in concorrenza)
    c) fare un trigger BEFORE INSERT
    del tipo
    
    DELIMITER //
    CREATE TRIGGER candidato_after_insert
    AFTER INSERT  ON candidato FOR EACH ROW
    BEGIN
    ... aggiorna il contatore
    END; //
    
    DELIMITER ;
    (non funziona affidabilmente in concorrenza in tutti i casi, ma è molto meglio di a e b)
    d) fare B ma con un
    LOCK TABLES candidato WRITE;
    ... prendi il MAX del campo
    ... fai il resto
    UNLOCK TABLES;
    
    ...insomma... come vedi ti stai facendo parecchi problemi rispetto a (3)
Devi accedere o registrarti per scrivere nel forum
7 risposte