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

标签 mysql database primary-key rename liquibase

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

因此,对该表的插入将失败,并显示类似于以下的消息:“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>

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

我的问题:

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

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

最佳答案

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

要使其保持自动递增,您需要使用 <modifySql>标记为 <append>自动递增/主键/不为空/等等。根据需要将信息添加到生成的 SQL 中。

关于mysql - 通过 Liquibase 重命名主键列,自动增量被删除(MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30166652/

相关文章:

mysql - ERROR 1064 (42000) - SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册以获取正确的语法

php - 结合 mysql 中 3 个查询的 3 个输出并进行一些计算

mysql - 在 MySQL 的主键字段中添加 NOT NULL 有什么意义?

mysql - 在mysql(innodb)中,大表如何影响缓冲区(内存)?

mysql - 多个线程可以操作同一个数据库吗?

Mysql查询选择好友

sql - Postgres 中单个连接的查询并行化

Grails 域类主键

php - 自增主键问题(MySQL)

mysql - 关于 MariaDB/MySQL C 连接器 API 的 C 字符串 I/O?