2015-11-24 37 views
11

Zastanawiam się, czy można uzyskać maksymalną wartość kolumny z określonej tabeli i ustawić ją jako wartość sekwencji początkowej bez czystego sql. Poniższy kod nie działa:Ustawia maksymalną wartość kolumny jako wartość początkową sekwencji ze znacznikami 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> 

masz błąd:

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

Próbowałem go bez nawiasów wokół select ... itp z tym samym rezultatem. Więc nie można użyć wartości obliczonej jako wartości sekwencji początkowej?

+1

Dla PostgreSQL jedyne co mogę myśleć jest stworzenie sekwencji, a następnie użyć '' tag uruchamiania 'wybrać SETVAL („id_seq” , (wybierz max (id) +1 z some_table)); '. –

+0

Czy możesz przesłać resztę pliku konfiguracyjnego? W jakim środowisku korzystasz z liquibase? –

+0

Norbert, Java8, Spring-boot 1.2.6, Liquibase 3.4.1, Postgres (9.3-1102-jdbc41) do wykonania i H2 do testów. – dfche

Odpowiedz

4

Więc takie rozwiązanie pracował dla mnie:

<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>