2017-02-21 110 views
2

我有兩個表聲明如下:Liquibase - 插入行以uuid

<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。我想通過DBMS生成這些UUID。

這樣做的最佳方法是什麼?我必須在我的更改日誌文件中使用SQL,還是使用XML?我更喜歡像XML或JSON這樣的DBMS獨立解決方案。

我的第二個問題是,我怎麼能與聲明UUID創建在插入的UUID列。例如:

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

謝謝你的時間!

回答

6

您可以通過使用根據當前DBMS定義的屬性來完成此操作。

<property name="uuid_type" value="uuid" dbms="postgresql"/> 
<property name="uuid_type" value="uniqueidentifier" dbms="mssql"/> 
<property name="uuid_type" value="RAW(32)" 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> 

請注意,您需要使用defaultValueComputedvalue

如果列具有默認值的定義,只是在插入語句中將其保留,然後數據庫在插入時將生成UUID。

+0

第一部分工作。它用'919d39e4-2387-4926-91d5-595ebe0eea07'的id來插入匈牙利。但是,對於第二次插入,它給出以下例外:'錯誤:插入或更新表「區域」違反了外鍵約束「fk_region_country」鍵(country_id)=(34e4e0d8-91d8-4d52-99ae-ec42d6b0e66e)不存在於表「國家」。使用外鍵很明顯,但我不知道如何在liquibase中使用它。下面是代碼使用:\t '<列名= 「COUNTRY_ID」 類型= 「$ {uuid_type}」 defaultValueComputed = 「$ {uuid_function}」> \t \t \t <約束可爲空= 「假」/> \t \t \t Thx –

+0

@FarkasIstván - 我收到了同樣的錯誤。希望我能很快找到答案,但在此期間,如果你知道了,請告訴我。 – degreesightdc