当前位置: 首页 > 面试题库 >

Liquibase-使用uuid插入行

廉元龙
2023-03-14
问题内容

我有两个表声明如下:

<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中使用?我更喜欢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>

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

如果该列是使用默认值定义的,则将其保留在插入语句中,然后数据库将在插入时生成UUID。



 类似资料:
  • 我们使用liquibase来管理MySQL数据库的更新、回滚等。 我遇到的一个小好奇是在更新或回滚过程中将值设置为null的过程。示例: 起初,我有点担心“null”会直接插入字符串“null”,但事实证明,liquibase似乎很聪明,可以插入一个空值。

  • Tarantool现在有一个内置类型UUID。 如何插入一条记录并使用https://github.com/tarantool/go-tarantool?传递这个字段 现在我有这个: 尝试将UUID作为字符串插入时 指数:

  • 如果我的ID是连续的,我如何使用Liquibase为PostgreSQL进行插入。我尝试以下几点: 我试着 错误是: 错误:列“id”中的空值违反了非空约束

  • 问题内容: 我有一个表字段类型varchar(36),我想由mysql动态生成它,所以我使用了以下代码: 插入记录后如何立即检索生成的uuid? 问题答案: 更好 你不能。唯一的解决方案是执行2个独立的查询: 其中$ uuid是第一步中获取的值。

  • 我对Maven和LiquiBase是新手。在过去的几天里,我一直在玩没有Maven的liquibase。我尝试用一个新数据库和一个现有数据库生成changelog文件。现在我正在尝试使用插件实现Maven和Liquibase。 > 从命令提示符运行带有Maven的Liquibase比仅仅从命令提示符运行Liquibase有什么好处? 生成pom.xml文件并为当前项目准备好src文件夹之后。我在p

  • 我正在尝试在Spring Boot中开发应用程序。我想使用Liquibase从文件加载数据,并将其传递给两个通过多对多关系连接的表(因此将是3个表,其中一个将保存id到另两个)。用LiquiBase做是不是一个好方法? 我试图使用customChange和开发自己的类,它将从文件中读取数据,并通过Hibernate EntityManager将其传递到数据库,但它不起作用。我无法创建EntityM