Query incremento campo numerico

di il
14 risposte

Query incremento campo numerico

Ciao a tutto il forum,

ho un problema su una query, che va ad incrementare di 1 un campo numerico.

Se il campo contiene già un valore, questa funziona, ma se il campo è NULL , non lo setta a 1.

Questa è la query che stò provando , e quello che vorrei ottenere, è che nel caso di tabella "nuova", cioè col campo = NULL, questo venga inizializzato a 1

Testandolo con SQL Management Studio, non evidenzia errori, ma segnala (0 righe interessate)

UPDATE Tab_Progressivo
SET Progressivo = CASE
    WHEN 
		Progressivo IS NULL THEN  1
    ELSE 
		(SELECT MAX(Progressivo) FROM Tab_Progressivo) + 1
	END

Grazie per eventuali suggerimenti

DG

14 Risposte

  • Re: Query incremento campo numerico

    Perchè il campo Progressivo supporta il NULL se deve essere solo un numero?

  • Re: Query incremento campo numerico

    Ciao Oregon,

    in effetti hai ragione, ma è un vecchio applicativo che sfruttava questo DB e purtroppo devo lavorare su questo.

    Grazie

    DG

  • Re: Query incremento campo numerico

    20/06/2025 - DanieleG ha scritto:

    un vecchio applicativo

    Allora perché c'è una tabella nuova? Se è nuova, vincoli il NOT NULL e via andare.

    Ma poi, questa tabella, ha un singolo record? Perché quella query non incrementa di uno. Setta il campo al MAX della colonna +1. Se ottieni l'incremento, non mi viene in mente altro che non il record singolo (anche perché non hai una WHERE)

    Ma soprattutto: almeno un INSERT prima è stato fatto?

  • Re: Query incremento campo numerico

    La Tabella ha una sola riga.

    Ovviamente ad ogni transazione, il progressivo viene incrementato di 1

    Anche se metto il campo NOT NULL, (ipoteticamente quando creo la tabella, il campo è NULL di default, oppure lo posso "forzare a 0 ?)

    DG

  • Re: Query incremento campo numerico

    Potresti spiegarmi il senso?

    la tabella ha un solo campo o ha un indice?

    nel primo caso: una tabella monocampo con valore null non ha record pertanto non puoi fare update di un valore che non c'è.

    sei nella situazione in cui hai definito la tabella ma non hai inserito alcun record e quindi nessun record da modificare.

    io opterei per una sp. controlli se la tabella è vuota e lanci una prima insert .... values (0);

    oppure ti ricordi di inserire il primo record con valore 0.

    poi lanci sempre in ogni caso update.... set progressivo=progressivo +1 semplicemente a che serve max(bla bla...) se esiste solo un record???

    secondo caso: se ha un campo indice, un solo record e il riferimento al campo contatore è null prima verifica se è null, lo porti a 0 sia questoo contatore che gli altri contatori che sono a null, poi come sopra 

    lanci sempre in ogni caso update.... set progressivo=progressivo +1 semplicemente a che serve max(bla bla...) se esiste solo un record???

  • Re: Query incremento campo numerico

    20/06/2025 - DanieleG ha scritto:

    (ipoteticamente quando creo la tabella, il campo è NULL di default,

    ipoteticamente e praticamente quando crei la tabella crei un contenitore vuoto...

    crei la tabella e fai subito dopo insert ... values (1, 0, 0, 0,...,0) per tutti i campi dove 1 è l'indice del record.

  • Re: Query incremento campo numerico

    Perfetto, fi qui siamo d' accordo.

    E' chiaro, che si può risolvere in diversi modi,  ma  quello che avrei voluto capire pero' è come mai non funziona la query iniziale, dove va a testare se il campo è NULL e non lo inizializza a 1.

    DG

  • Re: Query incremento campo numerico

    La query è sbagliata. Fai una singola IF ELSE per testare il NULL e inserisci i valori corretti

    Ma mi interessa farti capire che l'approccio è sbagliato e dato che la tabella la crei, fallo con il campo NOT NULL

  • Re: Query incremento campo numerico

    20/06/2025 - DanieleG ha scritto:

    ipoteticamente quando creo la tabella, il campo è NULL di default, oppure lo posso "forzare a 0 ?

    L'IDE, quando crei il campo nella nuota tabella, ti propone un nchar(10) nullable. Sei te che poi cambi il tipo (presumo un int) e che togli la spunta a "Consenti valori NULL". Devi aggiungere il passaggio di impostare il valore di default.

    Se lo fai da T-SQL dovresti avere un qualcosa di simile a

    CREATE TABLE [dbo].[Tab_Progressivo](
    	[ID] [int] NOT NULL,
    	[Progressivo] [int] NOT NULL
    ) ON [PRIMARY]
    GO
    
    ALTER TABLE [dbo].[Tab_Progressivo] ADD  CONSTRAINT [DF_Tab_Progressivo_Progressivo]  DEFAULT ((0)) FOR [Progressivo]
    GO
    

    Ma te almeno un INSERT lo devi fare per forza. Quindi inserirai 0 oppure, specificando in progettazione tabella il valore di default, puoi ometterlo in fase di INSERT e ti troverai comunque il valore di default nel campo.

  • Re: Query incremento campo numerico

    Io capisco che magari metti l'oggetto tabella e vedi la tabella vuota...

    cosa succede nel db?

    creiamo la tabella e interroghiamola:

    -- create
    CREATE TABLE contatori (
      Id INTEGER PRIMARY KEY,
      contatore1 INTEGER
    );
    
    
    SELECT * FROM CONTATORI;
    
    risultato: Program did not output anything!

    adesso aggiungiamo almeno un record:

    INSERT INTO contatori VALUES (1, NULL);
    SELECT * FROM CONTATORI;
    
    risultato:
    +----+------------+
    | Id | contatore1 |
    +----+------------+
    |  1 |       NULL |
    +----+------------+

    tralascio l'errore nel tentare di inserire un record con solo null...

    modifichiamo il campo null

    UPDATE CONTATORI SET CONTATORE1=0
    WHERE CONTATORE1 IS NULL;
    
    risultato:
    da così
    +----+------------+
    | Id | contatore1 |
    +----+------------+
    |  1 |       NULL |
    +----+------------+
    
    a così
    +----+------------+
    | Id | contatore1 |
    +----+------------+
    |  1 |          0 |
    +----+------------+

    questi passaggi li esegui ogni volta che rinnovi (crei) la tabella (anche se avendo sempre un solo record basta dare 

    UPDATE CONTATORI SET CONTATORE1=0
    WHERE CONTATORE1 IS NULL;

    adesso inseriamo la sql che devi usare per il contatore (magari richiami un funzione "metti_ID"):

    UPDATE CONTATORI SET CONTATORE1=CONTATORE1+1 WHERE ID=1;
    SELECT * FROM CONTATORI;
    
    risultato:
    +----+------------+
    | Id | contatore1 |
    +----+------------+
    |  1 |          1 |
    +----+------------+
  • Re: Query incremento campo numerico

    Molto chiaro.

    Grazie a tutti per il supporto !

    Saluti

    DG

  • Re: Query incremento campo numerico

    Salve,

    a me invece non e' per niente chiaro... a cosa serva uno heap (visto che pare sia una tabella monocampo e monoriga e non avra' sicuramente neanche chiave primaria)??

    potrei eventualmente capire una tabella progressivi con riferimento (senza foreign keys) su "altre" tabelle, tipo
    tab_Bolle, tab_Ricevute, tab_Clienti, tab_Altro dove in tabProgressivi hai una riga per ogni tabella e nel valore hai il progressivo... ripeto, potrei capiirlo ma non e' molto elegante... ma cosi' come l'hai proposta tu... mi lascia molto perplesso...

    salutoni romagnoli
    -- 
    Andrea

  • Re: Query incremento campo numerico

    Concordo con te Andrea, ma non ho fatto altre domande per evitare che si apra in questo thread tutto un discorso che porta, sicuramente, alla 'scoperta' che l'impostazione del DB è tutta da rivedere.

  • Re: Query incremento campo numerico

    In effetti...

    Giusto per chiarezza, nell'ipotesi di multi azienda, l'ID dei progressivi ha senso in una gestione progressivi fatta in questo modo. Magari piuttosto che avere 1, 2, 3 ecc... Si ritrova l'ID dell'azienda....ma nulla toglie il fatto che si possa creare una funzione che passa l'azienda, la tabella in questione ed usare il max valore della tabella come nel mix fatto ad inizio 3d. Cerca il valore max in una tabella che ha solo un record... Mi sa che ha visto vari siti copiato la sql ma senza capirne gli argomenti.

Devi accedere o registrarti per scrivere nel forum
14 risposte