在 Liquibase 中自动生成 UUID - Mysql MariaDB
Autogenerate UUID in Liquibase - Mysql MariaDB
我试图创建一个 table 其主键应该是在插入时自动生成的 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))
我删除了不相关的字段。
编辑:
如果有人能就此指出一些 reference/example 将会很有帮助。
据我所知,valueComputed
用于表达式,例如插入或更新。很难确定,因为 LiquiBase 文档对此属性非常模糊。
您似乎在使用它,就好像它是新 table 定义中列的默认值一样。我假设这个属性是 defaultValueComputed
。
但是 MySQL 不支持列默认值的表达式。你不能在 MySQL:
中做这样的 table
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());
如果您要将 UUID 存储在 mysql/mariadb 中,请不要使用 varchar/char 字段。它们只是一个 128 位二进制值,以良好的块分隔和十六进制格式输出。
使用 CHAR(36),它可能使用 utf8 编码的字符集并且每个字符至少使用 3 个字节,您需要 36*3 = 108 个字节来存储每个 UUID。
相反,您可以使用 BINARY(16) 字段 来存储基础值(=16 字节...)。遗憾的是,mysql 并没有开箱即用。有关如何在 mysql.
中转换 uuid 的更深入解释和更多信息,请参阅 http://mysql.rjweb.org/doc.php/uuid
我试图创建一个 table 其主键应该是在插入时自动生成的 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))
我删除了不相关的字段。
编辑: 如果有人能就此指出一些 reference/example 将会很有帮助。
据我所知,valueComputed
用于表达式,例如插入或更新。很难确定,因为 LiquiBase 文档对此属性非常模糊。
您似乎在使用它,就好像它是新 table 定义中列的默认值一样。我假设这个属性是 defaultValueComputed
。
但是 MySQL 不支持列默认值的表达式。你不能在 MySQL:
中做这样的 tableCREATE 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());
如果您要将 UUID 存储在 mysql/mariadb 中,请不要使用 varchar/char 字段。它们只是一个 128 位二进制值,以良好的块分隔和十六进制格式输出。
使用 CHAR(36),它可能使用 utf8 编码的字符集并且每个字符至少使用 3 个字节,您需要 36*3 = 108 个字节来存储每个 UUID。
相反,您可以使用 BINARY(16) 字段 来存储基础值(=16 字节...)。遗憾的是,mysql 并没有开箱即用。有关如何在 mysql.
中转换 uuid 的更深入解释和更多信息,请参阅 http://mysql.rjweb.org/doc.php/uuid