我们在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?
答案 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或命令行传递计算出的值。