次のように宣言された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>
お時間をいただきありがとうございます!
これは、現在の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>
defaultValueComputed
、notvalue
を使用する必要があることに注意してください
列がデフォルト値で定義されている場合は、挿入ステートメントで列を省略しておけば、データベースは挿入時にUUIDを生成します。
MySQLの場合、プロパティをchangeSetタグの直前に配置します。
<property name="u_id" value="uuid()" dbms="mysql"/>
その後
<column name="ID" type="varchar(255)" valueComputed="${u_id}"/>
注:ここではvalueComputed
ではなくdefaultValueComputed
を使用しています。
Rammgarotが述べたように、一意の値が必要な列を扱っているため、valueComputed
ではなくdefaultValueComputed
を使用する必要があります。
一部のデータベースはUUID列をサポートしています: H2データベースエンジンのUUIDタイプの列の各行のデフォルトでUUID値を生成します
LiquibaseにUUIDジェネレーターが埋め込まれているとは思わないので、列のdefaultValueComputed/valueComputedプロパティ( http://www.liquibase.org/documentation/column.html )+ UUIDを生成するDB関数