我有两个表声明如下:
<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&bsbb和bbbb。我想通过DBMS生成那些UUID。
最好的方法是什么?我是否必须在更改日志文件中使用SQL,或者是否可以使用XML?我更喜欢DBMS独立解决方案,如XML或JSON。
我的第二个问题是如何声明一个具有UUID的列,该列在插入时创建UUID。类似的东西:
<column name="id" type="uuid" value="??? GENERATE UUID ???">
<constraints nullable="false" unique="true" />
</column>
感谢您的时间!
答案 0 :(得分:10)
您可以使用根据当前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
如果使用默认值定义列,只需将其保留在insert语句中,然后数据库将在插入时生成UUID。
答案 1 :(得分:1)
对于MySQL,请将您的属性放在changeSet标记之前:
<property name="u_id" value="uuid()" dbms="mysql"/>
然后
<column name="ID" type="varchar(255)" valueComputed="${u_id}"/>
注意:此处使用的是valueComputed
,而不是defaultValueComputed
。
答案 2 :(得分:0)
某些数据库支持UUID列:Generate UUID values by default for each row on column of UUID type in H2 Database Engine
我不认为Liquibase已嵌入UUID生成器,请查看default(http://www.liquibase.org/documentation/column.html)+ DB函数的defaultValueComputed / valueComputed属性以生成UUID
答案 3 :(得分:0)
就像Rammgarot指出的那样,由于我们正在处理需要具有唯一值的列,因此我们应该使用valueComputed
而不是defaultValueComputed
。
答案 4 :(得分:0)
任何提供的答案都没有帮助我在 MySQL 的情况下,但我能够使用另一种方法解决它 - 使用触发器。
<changeSet author="nberezovski" id="1">
<createTable tableName="test">
<column name="id" type="varchar(255)">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="description" type="varchar(255)">
...
</createTable>
</changeSet>
<changeSet author="nberezovski" id="2">
<sql splitStatements="false">
CREATE TRIGGER insert_test
BEFORE INSERT ON test
FOR EACH ROW
BEGIN
IF (NEW.id IS NULL) THEN
SET NEW.id = UUID();
END IF;
END;
</sql>
</changeSet>
之后,每次手动插入 description
MySQL 的值都会自动为我生成一个 id
。例如:
insert into test(description) values('some description');
这种方法也有助于使用 loadData