【问题标题】:How to remove "auto increment" from a MSSQL table via liquibase如何通过 liquibase 从 MSSQL 表中删除“自动增量”
【发布时间】:2020-03-29 07:21:15
【问题描述】:

查看Liquibase documentation,我可以看到addAutoIncrement 的ChangeSet 操作...但是与之相反的操作(dropAutoIncrement?)似乎不存在。

问题

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

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

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

o.h.engine.jdbc.spi.SqlExceptionHelper : Cannot insert explicit value for identity column in table 'Widget' when IDENTITY_INSERT is set to OFF.

类型:int(自增)

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

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

我想要一些在此处编码的 liquibase xml:

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

    </changeSet>

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

【问题讨论】:

  • 您的 WidgetId 被创建为 IDENTITY,无法更改。您可以添加另一列,使用 WidgetId 中的数据对其进行更新,删除旧列并将新列重命名为 WidgetId
  • @sepupic 好的,谢谢。在表上启用 IDENTITY_INSERT 怎么样,这是个好主意还是坏主意?
  • 这正是我所说的。它在桌子上”。在 CREATE TABLE Widget IDENTITY 中使用了 WidgetId 定义。并且无法更改。在表级别

标签: java sql-server liquibase auto-increment


【解决方案1】:

我使用&lt;modifyDataType&gt; 标签做到了。这应该从列中删除AUTO_INCREMENT

<modifyDataType tableName="widget" columnName="widget_id" newDataType="int"/>

【讨论】:

    【解决方案2】:

    试试:

    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 列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 2019-06-09
      • 2012-11-18
      • 1970-01-01
      • 2011-01-13
      相关资源
      最近更新 更多