web-dev-qa-db-fra.com

Liquibase - insérer des lignes avec uuid

J'ai deux tableaux déclarés comme suit:

<changeSet author="istvan" id="country-table-changelog">
    <createTable tableName="country">
        <column name="id" type="uuid">
            <constraints nullable="false" unique="true" />
        </column>
        <column name="name" type="varchar">
            <constraints nullable="false" unique="true" />
        </column>
    </createTable>
</changeSet>

<changeSet author="istvan" id="region-table-changelog">
    <createTable tableName="region">
        <column name="id" type="uuid" >
            <constraints nullable="false" unique="true" />
        </column>
        <column name="country_id" type="uuid">
            <constraints nullable="false" />
        </column>
        <column name="name" type="varchar">
            <constraints nullable="false" unique="true" />
        </column>
    </createTable>
</changeSet>

<changeSet author="istvan" id="region-country-foreign-key-constraint">
    <addForeignKeyConstraint 
        baseTableName="region"
        baseColumnNames="country_id"
        referencedTableName="country"
        referencedColumnNames="id"
        constraintName="fk_region_country"
        onDelete="CASCADE" 
        onUpdate="RESTRICT"/>
</changeSet>

Je veux remplir les deux tableaux du fichier de journal de modifications de la base de données avec des valeurs comme:

INSERT INTO country VALUES('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 'HUNGARY');
INSERT INTO region VALUES('bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 'Baranya');

Dans l'exemple, j'ai utilisé les aaaa et bbbb simplement pour des raisons de simplicité. Je veux générer ces UUID par le SGBD.

Quelle est la meilleure façon de procéder? Dois-je utiliser SQL dans mes fichiers changelog ou est-ce possible avec XML? Je préfère une solution indépendante de SGBD comme XML ou JSON.

Ma deuxième question est la suivante: comment puis-je déclarer une colonne avec UUID qui crée l'UUID lors de l'insertion. Quelque chose comme:

<column name="id" type="uuid" value="??? GENERATE UUID ???">
    <constraints nullable="false" unique="true" />
</column>

Merci pour votre temps!

12
Farkas István

Vous pouvez le faire en utilisant des propriétés définies en fonction du SGBD actuel.

<property name="uuid_type" value="uuid" dbms="postgresql"/>
<property name="uuid_type" value="uniqueidentifier" dbms="mssql"/>
<property name="uuid_type" value="RAW(16)" dbms="Oracle"/>

<property name="uuid_function" value="uid.uuid_generate_v4()" dbms="postgresql"/>
<property name="uuid_function" value="NEWID()" dbms="mssql"/>
<property name="uuid_function" value="sys_guid()" dbms="Oracle"/>

Utilisez ensuite ces propriétés lors de la définition de la table:

<column name="id" type="${uuid_type}" defaultValueComputed="${uuid_function}">
    <constraints nullable="false" unique="true" />
</column>

Notez que vous devez utiliser defaultValueComputed, pasvalue

Si la colonne est définie avec une valeur par défaut, laissez-la simplement dans vos instructions d'insertion et la base de données générera alors l'UUID lors de l'insertion.

11
a_horse_with_no_name

Pour MySQL, mettez votre propriété juste avant la balise changeSet:

    <property name="u_id" value="uuid()" dbms="mysql"/>

puis

    <column name="ID" type="varchar(255)" valueComputed="${u_id}"/>

NOTE: ici valueComputed est utilisé, pas defaultValueComputed.

1
Rammgarot

Comme l'a noté Rammgarot, puisque nous avons affaire à des colonnes qui doivent avoir des valeurs uniques, nous devons utiliser valueComputed au lieu de defaultValueComputed.

0
user2121810

Certaines bases de données prennent en charge les colonnes UUID: Générer des valeurs UUID par défaut pour chaque ligne de la colonne de type UUID dans H2 Database Engine

Je ne pense pas que Liquibase ait un générateur UUID intégré, jetez un œil à la propriété defaultValueComputed/valueComputed pour la colonne ( http://www.liquibase.org/documentation/column.html ) + Fonction DB pour générer UUID

0
dbf