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

3

根据以下变更日志,执行在MySQL数据库上后,“table_person”表的主键列“将不具有自动递增功能。因此,在该表上插入数据将失败,并显示类似于以下信息的消息:"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>

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

我的问题:

如何在Liquibase中重命名mySQL数据库的主键列而不失去主键上的autoIncrement?

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

2个回答

2

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

如果想保持自动递增,您需要使用<modifySql>标签,根据需要将自动递增/主键/非空等信息<append>到生成的SQL中。


谢谢,我不知道<modifySql>。 然而,我猜这只是使用普通的<addAutoIncrement>语句完成我所做的另一种方式。您有关于如何解决autoIncrement从索引0开始的问题的建议吗? 我该如何将新的AutoIncrement设置为旧的最大值,以便下一个插入不会引发重复键异常? - SebastianRiemer

1
作为一种解决方法,您可以使用sql标记手动重命名列并保留自动增量:
<sql>ALTER TABLE `pkey` CHANGE `keyfield` `keyfield2` INT( 11 ) NOT NULL AUTO_INCREMENT</sql>

相关文章: 如何在MySQL中重命名主键列?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接