mysql - 如何限制 Liquibase 和 MySQL 中的文本索引
问题描述
当你有 chengeset 时:
<changeSet id="some.change.set" author="me">
<createTable tableName="some_table">
<column name="id" type="CHAR(36)">
<constraints primaryKey="true"/>
</column>
<column name="ref_id" type="CHAR(36)">
<constraints nullable="false"/>
</column>
<column name="path" type="VARCHAR(5000)"> <!-- very long column -->
<constraints nullable="false"/>
</column>
</createTable>
<createIndex tableName="some_table" indexName="some_table_long_index">
<column name="ref_id" />
<column name="path" />
</createIndex>
</changeSet>
当您执行它时,您将收到类似于以下内容的错误:
Error Code: 1071. Specified key was too long; max key length is 3072 bytes
发生这种情况是因为您的索引太长。你必须限制它。
解决方案
要限制我们的索引,您需要对其进行大小限制。不幸的是 Liquibase 不支持它,但有一个解决方法:
<createIndex tableName="some_table" indexName="some_table_long_index">
<column name="ref_id"/>
<column name="path"/>
</createIndex>
<modifySql dbms="mysql">
<replace replace="`path`" with="`path`(700)"/> <!-- "700" limits index size -->
</modifySql>
我已经搜索了很长时间,所以我将解决方案放在这里。也许它会对某人有所帮助。
推荐阅读
- html - ion icon-显示图标两次而不是一次
- google-sheets - 如何在 Google 表格中查询选择和更改请求的值?
- sql-server - 将分钟转换为 hh:mm 格式
- python - 如何将字典中的字符串值转换为python中的列表?
- android - 在webview中下载文件后如何只使用文件名
- javascript - 反应原生 - 将状态对象数组分配给变量并更新数组中特定元素的值
- matlab - MATLAB:array2table 中的错误
- r - 使用 ggplot 连接分组点图中的所有点
- vb.net - IErrorInfo.GetDescription 在 SQL 查询上失败,出现 E_FAIL(0x80004005)
- git - 如何恢复 git 存储库