sql - Liquibase - 插入带有 uuid 的行

标签 sql liquibase

我有两个表声明如下:

<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 变更日志文件中的两个表,例如:

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 的列,该列在插入时创建 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>

请注意,您需要使用defaultValueCompulated不是 value

如果该列定义了默认值,只需将其保留在插入语句中,数据库将在插入时生成 UUID。

关于sql - Liquibase - 插入带有 uuid 的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42361350/

相关文章:

mysql - 从未知数量的带有参数的表中选择

postgresql - Liquibase 无法使用 @ 和 ! 对用户进行身份验证在密码中

timeout - 如何设置Liquibase数据库连接超时和重试次数?

maven - liquibase maven 插件多个 changeLogFile

mysql - 从 createView 标记中删除架构名称

sql - Postgres WHERE 数组包含空字符串

sql - 如何限制 MySQL 距离查询

sql - 将文本转换为带时区的时间

java - 项目使用 Tomcat JNDI 数据源查找时如何实现 Liquibase 变更日志

c# - 我应该在多大程度上处理代码中的网络问题?