尽管uuid()在<property>内部调用了一次,但Liquibase生成了不同的UUID

时间:2018-11-02 20:14:49

标签: mysql uuid liquibase

我们在Liquibase中运行了以下内容:

<property name="UUID-20-off-General-US" value="uuid()" dbms="mysql"/>
<changeSet id="GeneralDiscountRateCard20" author="foo">
    <sql dbms="mysql">
        INSERT INTO rate (id, pricing_model, name)
        VALUES (${UUID-20-off-General-US}, 'CPM', '20% off Discount US');
        INSERT INTO rate_map (id, rate_map_name, rate_id)
        VALUES (uuid(), 'general_20_discount_us', ${UUID-20-off-General-US})
    </sql>
</changeSet>

我们希望看到两个表中使用的UUID相同(第二个表的id中使用不同的UUID)。相反,我们找到了3个不同的UUID。它们看起来几乎完全相同,只是数字5-8不同:

0dec159a-ded8-11e8-813e-42010a80044f
0dec7a69-ded8-11e8-813e-42010a80044f
0decc891-ded8-11e8-813e-42010a80044f
    ^^^^

大概是因为uuid()在同一小数秒内被调用。

<property>是否有延迟插值?有没有办法在两个对<property>的引用之间实际上具有相同的UUID?

1 个答案:

答案 0 :(得分:0)

即使设计成在同一查询中使用,调用uuid()也会返回不同的UUID。

MariaDB [(none)]> SELECT uuid(), uuid();
+--------------------------------------+--------------------------------------+
| uuid()                               | uuid()                               |
+--------------------------------------+--------------------------------------+
| c6996867-e19c-11e8-b32e-e0cb4eeb0025 | c699686c-e19c-11e8-b32e-e0cb4eeb0025 |
+--------------------------------------+--------------------------------------+

运行查询时,您将获得以下SQL语句:

INSERT INTO rate (id, pricing_model, name)
VALUES (uuid(), 'CPM', '20% off Discount US');
INSERT INTO rate_map (id, rate_map_name, rate_id)
VALUES (uuid(), 'general_20_discount_us', uuid())

导致三个不同的UUID。当您想“重用”值时,必须将值而不是函数调用保存在变量/属性中,并使用它,如下所示:

<property name="UUID-20-off-General-US" value="'c699686c-e19c-11e8-b32e-e0cb4eeb0025'" dbms="mysql"/>
<changeSet id="GeneralDiscountRateCard20" author="foo">
    <sql dbms="mysql">
        INSERT INTO rate (id, pricing_model, name)
        VALUES (${UUID-20-off-General-US}, 'CPM', '20% off Discount US');
        INSERT INTO rate_map (id, rate_map_name, rate_id)
        VALUES (uuid(), 'general_20_discount_us', ${UUID-20-off-General-US})
    </sql>
</changeSet>

或者您不使用硬编码的<property />标签,而是通过Ant或命令行传递计算出的值。