当前位置: 首页 > 知识库问答 >
问题:

如何通过liquibase从MSSQL表中删除“自动增量”

华展鹏
2023-03-14

在Liquibase留档中,我可以看到add自动增量的ChangeSet操作...然而,与之相反的(drop自动增量?)似乎不存在。

在数据库表Widget中,我已从单字段自动增量id(WidgetId)切换为复合id(超过3列)。在3列上添加新的主索引WidgetIdWidgetTypeOrderId)似乎工作正常。

在新设计下,我的应用程序可以显式设置WidgetId(例如:1、2、3…等)

但是,当我的应用程序将新数据插入表时,我收到以下错误:

o.h.engine.jdbc.spi.SqlExceptionHelper:当IDENTITY_INSERT设置为OFF时,无法在表'Widget'中插入标识列的显式值。

当我查看表Wigdets时,widgetId的类型是int(自动增量)-这是以前数据库设计的遗留问题(使用数据库生成的唯一ID),我认为这是这里的问题。

鉴于数据库是MS-SQL并且我们使用liquibase,如何从WidgetId中删除“自动增量”?

我想要一些在这里编码的分解xml:

    <changeSet author="steve" id="remove-auto-increment-from-widget-id">

    </changeSet>

我们的后端是:Liquibase 3.8.1/JPA/Java/MS-SQL

共有2个答案

程成天
2023-03-14

我用<代码>

<modifyDataType tableName="widget" columnName="widget_id" newDataType="int"/>
国胤
2023-03-14

尝试:

databaseChangeLog:
- objectQuotingStrategy: ${objectQuotingStrategy}
- changeSet:
    id: 1593006068007-1
    author: akoylu (generated)
    preConditions:
        not:
            dbms:
                type: h2
        onFail: MARK_RAN
    changes:
    - renameColumn:
        oldColumnName: id
        newColumnName: oldId
        tableName: Wigdets
    - addColumn:
        columns:
          - column:
              name: id
              type: int
        tableName: Wigdets
    - sql:
        sql: |
            update Wigdets set id = oldId;
    - dropPrimaryKey:
        tableName: Wigdets
    - addNotNullConstraint:
        columnDataType: int
        columnName: id
        tableName: Wigdets
    - addPrimaryKey:
        columnNames: id
        constraintName: WigdetsPK
        tableName: Wigdets
    - dropColumn:
          columnName: oldId
          tableName: Wigdets

脚本将id列重命名为oldId以传输数据,用存量数据更新新添加的列,删除主键,添加非空约束,将主键添加到新添加的列,最后删除旧的id列。

 类似资料:
  • 问题内容: 我在使用InnoDB的MySQL中有一个表,其中有一列名为“ id”的列。 所以我的问题是,每当我从表中删除最后一行然后插入新值时,新值都会在删除的ID之后插入。 我的意思是假设我的id是32,我想删除它,然后如果我在删除后插入新行,则列id会自动递增到33。因此序列格式被破坏了,即id = 30,31,33而且不是32。 因此,当我删除最后一列后插入时,请帮我分配ID 32(而不是3

  • 问题内容: 如何在Python中按索引从列表中删除元素? 我找到了方法,但是说我想删除最后一个元素,该怎么做?似乎默认的搜索列表,但是我不希望执行任何搜索。 问题答案: 使用并指定要删除的元素的索引:

  • 问题内容: 我试图根据另一个数据库的选择标准从一个数据库中删除记录。我们有两个表,emailNotification,用于存储作业和电子邮件列表。然后我们有工作。我想清除已关闭作业的emailNotifications。我在Stackoverflow上找到了一些较早的示例,这些示例将我带到了这种语法类型(我以前曾尝试在where之前进行连接)。 我收到错误消息,您无法在FROM子句中指定目标表’e

  • 问题内容: 我有一个带有主键字段且具有AUTO_INCREMENT的MySQL表。在阅读了这里的其他文章后,我发现人们遇到了同样的问题,答案也各不相同。有些人建议不要使用此功能,其他人则说它不能被“修复”。 我有: 示例:表中的记录数:18.如果我删除记录16、17和18-我希望输入的下一条记录的courseID为16,但是由于最后输入的courseID为18,所以它将为19。 我的SQL知识不是

  • 问题内容: 当文本溢出时,我的简单textarea不会显示水平条。它换行换行。那么,如何在文本溢出时删除自动换行并显示水平条呢? 问题答案: 默认情况下,Textareas不应自动换行,但是您可以将wrap =“ soft”设置为显式禁用换行: 编辑:“包装”属性不受官方支持。 我从德语的SELFHTML页面(这里是英文)获得了该页面,其中说IE 4.0和Netscape 2.0支持它。我还在FF

  • 如何通过引用对象或特定节点,有效地从java的LinkedList中删除节点?使用remove(object)遍历整个列表,文档证明了这一点:“删除第一个元素e,以便(o==null?e==null:o.equals(e))”。我可以通过对节点的特定引用来删除吗?我不介意将对节点的引用存储在对象本身中。我不能使用列表的索引,因为它可能会改变。如果没有,是否有另一种数据结构允许我这样做?