首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Liquibase -使用uuid插入行

问Liquibase -使用uuid插入行
EN

Stack Overflow用户
提问于 2017-02-21 07:42:00
回答 6查看 30.6K关注 0票数 25

我有两张表声明如下:

代码语言:javascript
复制
<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>

我希望用以下值填充液化基changelog文件中的两个表:

代码语言:javascript
复制
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?我更喜欢DBMS独立的解决方案,比如XML或JSON。

我的第二个问题是,如何使用UUID声明一个列,该列在insert上创建UUID。类似于:

代码语言:javascript
复制
<column name="id" type="uuid" value="??? GENERATE UUID ???">
    <constraints nullable="false" unique="true" />
</column>

谢谢您抽时间见我!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-02-22 11:35:36

您可以通过使用根据当前DBMS定义的属性来做到这一点。

代码语言:javascript
复制
<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"/>

然后在定义表时使用这些属性:

代码语言:javascript
复制
<column name="id" type="${uuid_type}" defaultValueComputed="${uuid_function}">
    <constraints nullable="false" unique="true" />
</column>

请注意,您需要使用defaultValueComputed,而不是 value。

如果列是用默认值定义的,只需将其放在insert语句中即可,然后数据库将在插入时生成UUID。

票数 36
EN

Stack Overflow用户

发布于 2018-06-27 11:02:06

对于MySQL,将属性放在changeSet标记之前:

代码语言:javascript
复制
    <property name="u_id" value="uuid()" dbms="mysql"/>

然后

代码语言:javascript
复制
    <column name="ID" type="varchar(255)" valueComputed="${u_id}"/>

注意:这里使用的是valueComputed,而不是defaultValueComputed。

票数 4
EN

Stack Overflow用户

发布于 2017-02-22 09:13:28

一些数据库支持UUID列:Generate UUID values by default for each row on column of UUID type in H2 Database Engine

我认为Liquibase没有嵌入UUID生成器,请看一看defaultValueComputed/valueComputed (http://www.liquibase.org/documentation/column.html) + DB函数生成UUID

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42361350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档