首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修改液化库中已定义的复合密钥

如何修改液化库中已定义的复合密钥
EN

Stack Overflow用户
提问于 2022-03-01 19:39:54
回答 1查看 324关注 0票数 0

我需要修改一个表,以修改从下面提到的变更集的复合键中创建的索引的顺序。

代码语言:javascript
复制
<changeSet author="demo (generated)" id="demo-11">
        <createTable tableName="customersalesdata">
            <column name="id" type="BIGINT">
                <constraints unique="true" primaryKey="true" primaryKeyName="customersalesdata_pkey"/>
            </column>
            <column name="customerid" type="NVARCHAR(255)">
                <constraints primaryKey="true" unique="true" primaryKeyName="customersalesdata_pkey"/>
            </column>   </createTable>
    </changeSet>

更改的原因是索引中列的排序产生了很大的不同。因为customerid是第二列,所以不会使用它。因此,查询正在执行索引扫描。由于该表有两个以id开头的索引,按照这个顺序使用idcustomerid是一种浪费(在大多数情况下)。

因此,我需要将列顺序更改为customeridid。另一个问题是customerid,它是复合键,在另一个表中称为外键。

我的问题是,我是否需要先删除FK,然后删除复合键,然后按如下所示的顺序形成复合键

代码语言:javascript
复制
<changeSet id="2">
        <addPrimaryKey columnNames="customerid, id"
                       constraintName="customersalesdata_pkey"
                       tableName="customersalesdata"
                       validate="true"/>
    </changeSet>

或者,通过组合这两个字段,在复合键的顶部创建另一个索引,如下所示

代码语言:javascript
复制
<changeSet author="demo" id="demo-id">
        <createIndex tableName="customersalesdata" indexName="idxn_customer_id_id">
            <column name="customer_id"/>
            <column name="id"/>
        </createIndex>
    </changeSet>

此外,在这两种情况下,是否会有任何机会失去数据?你能建议一下最好的方法吗。

EN

回答 1

Stack Overflow用户

发布于 2022-04-26 22:08:55

一个类似的问题在这个帖子。上被问了一段时间

我将从那条线索中转译两个最流行的答案。

#1

您可以阅读Liquibase 文档,并且还有一个与引用这里类似的问题。在上面链接的“在Liquibase中添加复合唯一约束”中出现的情况下,解决方案是

#2

我很肯定: #1您不能在createTable标记本身内这样做,但是您可以在与创建表时相同的变更集中完成它。#1它确实在这两列上创建了一个复合唯一约束。您可以检查的一种方法是使用命令运行液化库来为更新生成SQL,而不是运行update命令并检查它对数据库的作用。在命令行上,您将运行液化库updateSQL,而不是运行液化库更新。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71313803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档