Mysql 无法添加非主键标识列
因此,我在liquibase中创建了一个名为Mysql 无法添加非主键标识列,mysql,sql,liquibase,Mysql,Sql,Liquibase,因此,我在liquibase中创建了一个名为tv\u actions的表,如下所示 <changeSet id=" add tv campaigns table" author="abc"> <createTable tableName="tv_campaigns"> <column name="campaign_id" type="int" autoIncrement="false">
tv\u actions
的表,如下所示
<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>
运行此变更集时,我遇到以下错误:“无法添加非主键标识列”
。尝试通过删除较旧的主键(campaign_id)将“id”添加为主键,这也会引发关于未正确定义外键关系的错误(因为原始主键也引用另一个表的键)
有没有一种方法可以很好地做到这一点呢?这听起来像是MySQL强加的限制。这并不奇怪,真的。您是否能够使用SQL语句进行相同的更改?如果是这样,那么应该可以通过液化酶来实现。但是如果你不能用SQL来做,那么你也不能用Liquibase来做。我相信你现有的列被认为是主键。要检查它,请参阅HeidiSQL或类似文件中的indexes选项卡。你可以在这里找到更多关于这个主题的信息 以下变更集应起作用:
<changeSet id="1" author="Me">
<dropPrimaryKey tableName="tv_campaigns"/>
<addColumn tableName="tv_campaigns">
<column name="ID" type="bigint(20)" autoIncrement="true">
<constraints nullable="false" primaryKey="true" unique="true"/>
</column>
</addColumn>
<addAutoIncrement tableName="tv_campaigns" columnName="ID" columnDataType="bigint(20)"/>
</changeSet>
为什么不先从活动id中删除FK约束,然后从电视活动中删除主键,然后将主键设置为id列,然后将外键设置为活动id?