2015-11-24 10 views
11

Mi chiedo se sia possibile ottenere il massimo valore di colonna da una determinata tabella e impostarlo come valore di sequenza iniziale senza sql puro. Il seguente codice non funziona:Imposta il valore massimo della colonna come valore iniziale della sequenza con i tag liquibase

<property name="maxId" value="(select max(id)+1 from some_table)" dbms="h2,mysql,postgres"/> 
    <changeSet author="author (generated)" id="1447943899053-1"> 
     <createSequence sequenceName="id_seq" startValue="${maxId}" incrementBy="1"/> 
    </changeSet> 

ottenuto un errore:

Caused by: liquibase.parser.core.ParsedNodeException: java.lang.NumberFormatException: For input string: "${m" 

ho provato senza parentesi attorno select ... ecc con lo stesso risultato. Quindi non è possibile usare il valore calcolato come valore di sequenza iniziale?

+1

Per Postgres l'unica cosa che mi viene in mente è quello di creare la sequenza, quindi utilizzare un tag '' per eseguire 'selezionare setval ('id_seq' , (seleziona max (id) +1 da some_table)); '. –

+0

Puoi pubblicare il resto del tuo file di configurazione? In che ambiente stai usando il liquibase? –

+0

Norbert, Java8, Spring-boot 1.2.6, Liquibase 3.4.1, Postgres (9.3-1102-jdbc41) per l'esecuzione e H2 per i test. – dfche

risposta

4

Quindi, tale soluzione ha funzionato per me:

<changeSet author="dfche" id="1448634241199-1"> 
    <createSequence sequenceName="user_id_seq" startValue="1" incrementBy="1"/> 
</changeSet> 
<changeSet author="dfche" id="1448634241199-2"> 
    <sql dbms="postgresql">select setval('user_id_seq', max(id)+1) from jhi_user</sql> 
    <sql dbms="h2">alter sequence user_id_seq restart with (select max(id)+1 from jhi_user)</sql> 
</changeSet>