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

时间:2015-05-11 11:36:55

标签: mysql database primary-key rename liquibase

给定以下更改日志,表“table_person”在其主键列上“在MySQL数据库上执行后”将不会有autoIncrement。

因此,该表上的插入将失败,并显示类似于以下内容的消息:“SQL错误(1062):密钥'PRIMARY'重复输入'0'”

<?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>

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

我的问题:

如何在不丢失mySQL数据库主键的autoIncrement的情况下重命名Liquibase中的主键列?

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

2 个答案:

答案 0 :(得分:1)

不幸的是,它是mysql的限制。 liquibase运行的SQL是alter table table_person change table_persion_id id int,它将列重新定义为“int”。

要将其保持为自动增量,您需要使用<modifySql>标记<append>自动增量/主键/非空/等。根据需要向生成的SQL提供信息。

答案 1 :(得分:1)

作为一种解决方法,您可以使用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?