2017-02-21 73 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