【发布时间】:2020-03-29 07:21:15
【问题描述】:
查看Liquibase documentation,我可以看到addAutoIncrement 的ChangeSet 操作...但是与之相反的操作(dropAutoIncrement?)似乎不存在。
问题
在数据库表 Widget 中,我已从单字段自动递增 id (WidgetId) 切换到复合 id(超过 3 列)。在 3 列上添加新的主索引(WidgetId、WidgetType、OrderId)似乎工作正常。
在新设计下,我的应用程序可能会显式设置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