Come trovare il valore generato successivo per una colonna di incremento automatico?

Faccio alcuni problemi con le colonne di incremento automatico di IBM DB2. In un primo momento, tutte le mie colonne erano definite come SEMPRE GENERATE , ma poiché ho avuto problemi con questo command usando il command "db2 import …", li ho cambiati in GENERED BY DEFAULT . Questo è necessario, poiché ho bisogno degli ID per essere coerenti, perché altre tabelle li riferiscono. Quindi l'utilizzo di "db2 import … modificato da identityignore …" non è un'opzione.

Quando ora importi i dati, gli ID sono inseriti correttamente, ma each volta che faccio questo, devo ricordare di impostare un nuovo inizio per la colonna di incremento automatico ottenendo il massimo Id + 1 e modificare la colonna come questa:

  • Il failover automatico di DB in c # non funziona quando il server principale scompare fisicamente
  • Sono state estratte da spazio su disco, come tar senza creare copia
  • Qualsiasi modo per copiare lo schema da un database MySQL ad un altro?
  • Eseguire il backup di un database di notte
  • Molti file enormi in Sharepoint ... Esistono tutti i software "stubbing" o "shortcutting"?
  • Come calcolare max_connections per PostgreSQL e default_pool_size per pgbouncer?
  • SELECT MAX(mycolumn)+ 1 FROM mytable; ALTER TABLE mytable ALTER COLUMN mycolumn RESTART WITH <above_result>; 

    Se dimentico questo, un'istruzione Inserisci non riesce con un errore PK duplicato, poiché la colonna di incremento automatico è la chiave primaria.

    Quindi la mia domanda è: C'è un modo per trovare il valore successivo per una colonna di incremento automatico, in modo da poter scrivere le dichiarazioni che verificherebbero se questo valore è inferiore al SELECT MAX e deve essere impostato?

    Oppure: Non è tutta questa cosa complicata come mi sembra? Posso in qualche modo importre i dati, conservando gli ID e avere la colonna di incremento automatico ancora funzionante come previsto?

    4 Solutions collect form web for “Come trovare il valore generato successivo per una colonna di incremento automatico?”

    Tim, avevo affrontato lo stesso problema in cui wherevo riavviare l'identity framework; al valore successivo. Stavo usando db2v9.1.

    Purtroppo non è ansible specificare automaticamente il valore successivo. Come per la documentazione DB2 il valore dovrebbe essere una 'costante numbersca'. Quindi ho dovuto fare un max selezionato (id), get il valore e sostituirlo manualmente con il command alter..restart.

    Non ricordo se ho provato questo – ma puoi scrivere una sp where max (id) è impostato in una variabile e assegnare la variabile nell'alter rest … restart stmt. (Non riesco a provare perché non ho più accesso ad alcun database db2). Dubito che functionrà comunque. (Se funziona faccia sapere :))

    Riferimento DB2:

    RESTART o RESTART CON costanza numbersca

    Ripristina lo stato della sequenza associata alla colonna di identity framework;. Se non è specificata CON costante numbersca, la sequenza per la colonna identity framework; viene riavviata al valore specificato, in modo implicito o esplicito, come valore iniziale quando la colonna identity framework; è stata originariamente creata. La colonna deve esistere nella tabella specificata (SQLSTATE 42703) e deve essere già definita con l'attributo IDENTITY (SQLSTATE 42837). RESTART non modifica il valore iniziale START.

    La costante numbersca è una costante numbersca esatta che può essere qualsiasi valore positivo o negativo che potrebbe essere assegnato a questa colonna (SQLSTATE 42815), senza cifre non zero che esistono a destra del punto decimale (SQLSTATE 428FA). La costante numbersca verrà utilizzata come valore successivo per la colonna.

    Non è ansible utilizzare un numero di sequenza in DB2 e utilizzare la sequenza. nextval ()?

    Collegamento ai valori di sequenza automaticamente generati in DB2: http://www.ibm.com/developerworks/data/library/techarticle/0302fielding/0302fielding.html

    Il problema è già stato risolto, ma per tutti gli altri con lo stesso problema: posso offrire una soluzione per get il max_id +1 per tutte le tabelle. L'unica limitazione è che la colonna di origine deve essere una colonna di autocostruzione (GENERATED = 'D'). I risultati possono essere eseguiti tramite clp o altri strumenti di query.

     SELECT 'alter table ' || rtrim(TABSCHEMA) || '.' || TABNAME || ' alter column ' || COLNAME || ' restart with ' || cast((case when (trim ((replace ( HIGH2KEY, '+' , '' )))) = '' then 0 else integer(trim ((replace ( HIGH2KEY, '+' , '' ))))+2 end) as varchar(20)) || ' ;' FROM SYSCAT.COLUMNS WHERE GENERATED = 'D' 
    1. perché si potrebbe anche pensare di utilizzare l'incremento automatico se si import manualmente i dati per quella colonna? questa incrementazione automatica non viene utilizzata affatto,
    2. In un'applicazione simile ho scritto un SP. chiama l'opzione admin_cmd – load b. seleziona il massimo (id) – e li carica insieme al timestamp corrente in una tabella di registro Richiama la tabella di registro e aggiorna usando uno script bash / windows. Semplice….
    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.