2015-05-11 13 views
0

給出的以下更改日誌,表「table_person」將不會有在其主鍵列「自動增量MySQL數據庫上執行之後。經由Liquibase重命名主鍵列,自動增量被丟棄(MySQL的)

因此插入該表將失敗,類似的消息:「SQL錯誤(1062):重複錄入‘0’鍵‘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數據庫中的主鍵鬆動自動增量?

(注意,在PostgreSQL上的自動增量不是主鍵列的命名過程中丟失)

回答

1

不幸的是它是MySQL的的限制。 liquibase運行的SQL是alter table table_person change table_persion_id id int,它將列重新定義爲「int」。

要保持它爲自動增量,您需要使用<modifySql>標籤來<append>自動增量/主鍵/非空/等。信息到需要的生成的SQL。

+0

謝謝,我不知道 然而,我猜測這只是完成我使用普通的語句完成的另一種方式。 你有關於如何解決與索引0開始的autoIncrement問題的建議? 如何將新的AutoIncrement設置爲舊的最大值,以便下一個插入不會引發重複鍵異常? – SebastianRiemer

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?