通过 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?
鉴于以下更改日志,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?