无法添加非主键标识列

时间:2016-02-16 21:10:00

标签: mysql sql liquibase

所以我在liquibase中创建了一个名为tv_campaigns的表,如下所示。

<changeSet id=" add tv campaigns table" author="abc">
        <createTable tableName="tv_campaigns">
            <column name="campaign_id" type="int" autoIncrement="false">
                <constraints primaryKey="true"
                             foreignKeyName="fk_linear_tv_campaign_id"
                             references="campaigns(id)"
                             nullable="false"/>
            </column>
        </createTable>
    </changeSet>

此处主键和外键相同(campaign_id),表只有一列。 后来我意识到我需要在这个表中有一个自动增量列,然后继续添加这个变更集:

<changeSet id="add auto increment column" author="abc">
        <addColumn tableName="tv_campaigns">
            <column name="id" type="int" autoIncrement="true">
                <constraints unique="true"
                             nullable="false"/>
            </column>
        </addColumn>
    </changeSet>

在运行此变更集时,我收到以下错误:"Cannot add a non-primary key identity column"。尝试添加&#39; id&#39;删除旧的主键(campaign_id)作为主键,并且抛出关于未正确定义的外键关系的错误(因为原始主键也引用了另一个表的键)。

有没有办法做得好或做到这一点?

2 个答案:

答案 0 :(得分:0)

这听起来像是MySQL强加的限制。真的,这并不奇怪。您是否能够使用SQL语句进行相同的更改?如果是这样,那么应该可以通过Liquibase实现。但是如果你不能用SQL做,那么你也不能用Liquibase来做。

答案 1 :(得分:0)

我认为您现有的列被视为主键。为了检查它,请参阅HeidiSQL或类似文件中的“索引”选项卡。您可以在Add Auto-Increment ID to existing table?

中找到有关此主题的更多信息

以下变更集应该起作用:

tabBox