在Liquibase中自动生成UUID - Mysql MariaDB

时间:2017-05-17 12:44:08

标签: mysql mariadb uuid liquibase

我正在尝试创建一个表,其主键应该是isertion上的自动生成的UUID。

mysql --version
mysql  Ver 15.1 Distrib 10.1.22-MariaDB, for osx10.11 (x86_64) using readline 5.1

这是我尝试的变更集:

   <changeSet author="shalinlk" id="201705161522">
    <createTable tableName="quiz_question">
        <column valueComputed="UUID()" name="id" type="CHAR(36)">
            <constraints primaryKey="true" nullable="false"/>
        </column>
        <column name="quiz_id" type="CHAR(36)">
            <constraints nullable="true" foreignKeyName="fk_quiz_question_quiz_id"
                         references="quiz(id)"/>
        </column>
        <column name="question_id" type="CHAR(36)">
            <constraints nullable="true" foreignKeyName="fk_quiz_question_question_id"
                         references="question(id)"/>
        </column>
    </createTable>
</changeSet>

但这甚至没有在生成的相应查询中处理 valueComputed 属性。任何人都可以帮忙。

注意:查询

select UUID();
当我在mysql终端中尝试时,

正常工作。

修改: 生成的查询是

CREATE TABLE quiz_question (
    id CHAR(36), 
    quiz_id CHAR(36) NULL, 
    question_id CHAR(36) NULL, 
    CONSTRAINT PK_QUIZ_QUESTION PRIMARY KEY (id), 
    CONSTRAINT fk_quiz_question_question_id FOREIGN KEY (question_id) 
    REFERENCES question(id), 
    CONSTRAINT fk_quiz_question_quiz_id FOREIGN KEY (quiz_id) REFERENCES quiz(id))

我删除了不相关的字段。

修改: 如果有人可以在此指出一些参考/示例,将会有所帮助。

2 个答案:

答案 0 :(得分:3)

据我所知,valueComputed用于表达式,例如插入或更新。很难确定,因为LiquiBase文档在这个属性上非常模糊。

您似乎正在使用它,就像它是新表定义中列的默认值一样。我假设该属性为defaultValueComputed

但MySQL不支持列默认值的表达式。你不能在MySQL中创建这样的表:

CREATE TABLE quiz_question (
    id CHAR(36) DEFAULT UUID(), 
    ...

您必须创建一个触发器以将UUID()分配给主键列。如下所示:

CREATE TRIGGER quiz_question_ins BEFORE INSERT ON quiz_question
FOR EACH ROW SET id = COALESCE(id, UUID());

答案 1 :(得分:0)

如果您要将UUID存储在mysql / mariadb中,请不要使用varchar / char字段。它们只是一个128位二进制值,以漂亮的块分隔和十六进制格式输出。

使用CHAR(36),它可能使用utf8编码的字符集并且每个字符至少使用3个字节,您需要36 * 3 = 108个字节来存储每个UUID。

相反,您可以使用BINARY(16)字段来存储基础值(= 16 Bytes ...)。可悲的是,mysql没有开箱即用。有关如何在mysql中转换uuids的更多信息,请参阅http://mysql.rjweb.org/doc.php/uuid