Liquibase - 用uuid插入行

Far*_*ván 9 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>
Run Code Online (Sandbox Code Playgroud)

我想从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');
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我使用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>
Run Code Online (Sandbox Code Playgroud)

感谢您的时间!

a_h*_*ame 11

您可以使用根据当前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"/>
Run Code Online (Sandbox Code Playgroud)

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

<column name="id" type="${uuid_type}" defaultValueComputed="${uuid_function}">
    <constraints nullable="false" unique="true" />
</column>
Run Code Online (Sandbox Code Playgroud)

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

如果使用默认值定义列,只需将其保留在insert语句中,然后数据库将在插入时生成UUID.

  • 当使用 `value="gen_random_uuid()"` 定义函数属性时,我让它与 postgres (14.5) 一起工作(否则我会收到有关 uid 命名空间的错误) (3认同)