【问题标题】:Adding an auto increment unique key using liquibase使用 liquibase 添加自动增量唯一键
【发布时间】:2021-12-21 06:34:48
【问题描述】:

我有一个名为 event 的表,它已经有一个主键。我在事件表中保存了一些记录。现在我想为同一个表添加一个自动增量列。我创建了一个新的 changelog.xml 文件并在 xml 中添加了以下内容。

<changeSet author="user" id="1">
        <addColumn tableName="event">
            <column name="id" type="BIGINT" >
                <constraints nullable="false" unique="true" uniqueConstraintName="event_id_auto_increment" />
            </column>
        </addColumn>
        
        <addAutoIncrement incrementBy="1" tableName="event" columnName="id" columnDataType="BIGINT" />
        
</changeSet>

但我在启动应用程序时遇到了异常。

Caused by: liquibase.exception.DatabaseException: Duplicate entry '0' for key 'id' [Failed SQL: (1062) ALTER TABLE event ADD UNIQUE (id)]
    at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:393)
    at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:82)
    at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:150)
    at liquibase.database.AbstractJdbcDatabase.execute(AbstractJdbcDatabase.java:1278)
    at liquibase.database.AbstractJdbcDatabase.executeStatements(AbstractJdbcDatabase.java:1260)
    at liquibase.changelog.ChangeSet.execute(ChangeSet.java:637)
    ... 169 common frames omitted
Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '0' for key 'id'
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:117)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.StatementImpl.executeInternal(StatementImpl.java:762)
    at com.mysql.cj.jdbc.StatementImpl.execute(StatementImpl.java:646)
    at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:94)
    at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java)
    at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:389)
    ... 174 common frames omitted

新列 id 已在事件表中创建,所有现有行的值为 0。但并没有增加。有人可以帮我弄这个吗?任何帮助,将不胜感激。谢谢

【问题讨论】:

    标签: mysql spring-boot liquibase


    【解决方案1】:

    我认为问题在于您的表中有预先存在的数据。我建议你先创建专栏。不要立即添加约束。

    运行update 语句以使用唯一值更新新列(例如,将行号插入该列的每一行)。

    在此行中拥有唯一数据后,您可以添加唯一约束。并将自动增量添加到此列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 2019-07-23
      • 2011-02-22
      • 2014-02-10
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      相关资源
      最近更新 更多