给定以下更改日志,表“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不会丢失)
答案 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>