liquibase生成不同的uuid,尽管uuid()在< property>

rqmkfv5c  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(431)

我们在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(而在另一个表中使用不同的uuid) id 第二张table)。相反,我们发现了3个不同的uuid。他们看起来几乎一模一样,只是数字5-8不同:

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

大概是因为 uuid() 在同一个分数秒左右被调用。
<property> 有延迟插值吗?有没有一种方法可以在对的两个引用之间实际拥有相同的uuid <property> ?

ftf50wuq

ftf50wuq1#

打电话 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或命令行传递计算值。

相关问题