通过 Liquibase 重命名主键列,自动增量被删除(MySQL)

Renaming primary key column via Liquibase, autoincrement is dropped(MySQL)

鉴于以下更改日志,table "table_person" 在 MySQL 数据库上执行后,其主键列上将不会有自动增量。

因此在 table 上插入将失败,并显示类似于以下的消息:"SQL error (1062): Duplicate entry '0' for key 'PRIMARY'"

<?xml version="1.0" encoding="UTF-8"?><databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
     http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

<changeSet id="201505111301" author="sr">   
    <createTable tableName="table_person">
        <column name="table_person_id" type="int" autoIncrement="true">
            <constraints primaryKey="true" nullable="false" />
        </column>
        <column name="name" type="varchar(255)">
            <constraints nullable="false" />
        </column>
    </createTable>

    <insert tableName="table_person">
        <column name="name" value="TestValue1" type="varchar(255)"/>
    </insert>
    <insert tableName="table_person">
        <column name="name" value="TestValue2" type="varchar(255)"/>
    </insert>

    <renameColumn oldColumnName="table_person_id" newColumnName="id" tableName="table_person" columnDataType="int"/>    
</changeSet>

我尝试使用以下方法修复该问题:

<addAutoIncrement tableName="table_person" columnName="id" columnDataType="int"></addAutoIncrement>

这将重新创建丢失的自动增量,但显然会再次从索引 0 开始。如果数据已经存在,这又会导致问题。

我的问题:

如何在不丢失 mySQL 数据库主键上的自动增量的情况下重命名 Liquibase 中的主键列?

(注意,在 postgreSQL 上,autoIncrement 在重命名主键列时不会丢失)

很遗憾,这是 mysql 的限制。 liquibase 的 SQL 运行 是 alter table table_person change table_persion_id id int,它将列重新定义为 "int"。

要使其保持自动递增,您需要使用 <modifySql> 标记来 <append> auto-increment/primary key/not null/etc。根据需要向生成的 SQL 发送信息。

作为解决方法,您可以使用 sql 标记手动重命名列并保持自动递增:

<sql>ALTER TABLE `pkey` CHANGE `keyfield` `keyfield2` INT( 11 ) NOT NULL AUTO_INCREMENT</sql>

相关:How do I rename a primary key column in MySQL?