在Liquibase - Mysql MariaDB中自动生成UUID

3

我试图创建一个表,其主键应该是在插入时自动生成的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))

我已经删除了不相关的字段。

编辑: 如果有人能提供一些参考或示例,那将会很有帮助。


生成的查询长什么样? - Sloan Thrasher
创建表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))] - Shalin LK
请不要在评论中放置代码。请编辑您的答案以添加信息。 - Sloan Thrasher
2个回答

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());

0

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

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

相反,你可以使用BINARY(16)字段来存储底层值(=16字节...)。不幸的是,mysql默认情况下不支持此操作。请参见http://mysql.rjweb.org/doc.php/uuid以获取更深入的解释和有关如何在mysql中转换uuid的更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接