web-dev-qa-db-ja.com

Liquibase-uuidで行を挿入する

次のように宣言された2つのテーブルがあります。

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

Liquibase changelogファイルの両方のテーブルに、次のような値を入力します。

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');

この例では、単純さのためにaaaaとbbbbを使用しました。それらのUUIDをDBMSで生成したいと思います。

それを行う最良の方法は何ですか?変更ログファイルでSQLを使用する必要がありますか、それともXMLで可能ですか? XMLやJSONのようなDBMSに依存しないソリューションを好みます。

2つ目の質問は、挿入時にUUIDを作成するUUIDを使用して列を宣言するにはどうすればよいかということです。何かのようなもの:

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

お時間をいただきありがとうございます!

12
Farkas István

これは、現在のDBMSに応じて定義されているプロパティを使用して行うことができます。

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

次に、テーブルを定義するときにこれらのプロパティを使用します。

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

defaultValueComputednotvalueを使用する必要があることに注意してください

列がデフォルト値で定義されている場合は、挿入ステートメントで列を省略しておけば、データベースは挿入時にUUIDを生成します。

11

MySQLの場合、プロパティをchangeSetタグの直前に配置します。

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

その後

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

注:ここではvalueComputedではなくdefaultValueComputedを使用しています。

1
Rammgarot

Rammgarotが述べたように、一意の値が必要な列を扱っているため、valueComputedではなくdefaultValueComputedを使用する必要があります。

0
user2121810

一部のデータベースはUUID列をサポートしています: H2データベースエンジンのUUIDタイプの列の各行のデフォルトでUUID値を生成します

LiquibaseにUUIDジェネレーターが埋め込まれているとは思わないので、列のdefaultValueComputed/valueComputedプロパティ( http://www.liquibase.org/documentation/column.html )+ UUIDを生成するDB関数

0
dbf