How to migrate join table to entity table with liquibase without liquibase.exception.DatabaseException: ERROR: column "id" contains null values

How to migrate join table to entity table with liquibase without liquibase.exception.DatabaseException: ERROR: column "id" contains null values

我正在对 table 进行升级,该 table 以前只是连接 table 到真实实体。所以,它应该没有它加入的实体ids的主键,并建立自己的id。我试过这个更新配置:

<changeSet id="20200429180824-1" author="jhipster">
    <dropPrimaryKey columnNames="teacher_id, subject_id" tableName="teacher_subject"/>
    <addColumn tableName="teacher_subject" author="jhipster">
        <column name="id" type="bigint" autoIncrement="${autoIncrement}">
            <constraints primaryKey="true" nullable="false"/>
        </column>
        <column name="teacher_status" type="varchar(255)" defaultValue="APPROVED">
            <constraints nullable="true" />
        </column>

        <column name="achieved" type="datetime" defaultValueComputed="CURRENT_TIMESTAMP" >
            <constraints nullable="true" />
        </column>

        <column name="active" type="boolean" defaultValue="true">
            <constraints nullable="true" />
        </column>
        <!-- jhipster-needle-liquibase-add-column - JHipster will add columns here, do not remove-->
    </addColumn>

    <dropDefaultValue tableName="teacher_subject" columnName="achieved" columnDataType="datetime"/>
</changeSet>

然而,在迁移时我遇到了这个异常的失败,尽管我期望该列应该在此刻刚刚创建并预先填充 autoIncrement 数据:

liquibase.exception.DatabaseException:错误:列 "id" 包含空值

但是,我已经意识到问题的根源在于强制“nullable=false”。将其移动到同一变更集的不同位置并稍后执行后,迁移成功。最终的变更集看起来像,请注意单独的 addNotNullConstraintprimaryKey-仅 <constraints primaryKey="true"/> 此处:

<changeSet id="20200429180824-1" author="jhipster">
    <dropPrimaryKey columnNames="teacher_id, subject_id" tableName="teacher_subject"/>
    <addColumn tableName="teacher_subject" author="jhipster">
        <column name="id" type="bigint" autoIncrement="true">
            <constraints primaryKey="true"/>
        </column>
        <column name="teacher_status" type="varchar(255)" defaultValue="APPROVED">
            <constraints nullable="true" />
        </column>

        <column name="achieved" type="datetime" defaultValueComputed="CURRENT_TIMESTAMP" >
            <constraints nullable="true" />
        </column>

        <column name="active" type="boolean" defaultValue="true">
            <constraints nullable="true" />
        </column>
        <!-- jhipster-needle-liquibase-add-column - JHipster will add columns here, do not remove-->
    </addColumn>
    <addNotNullConstraint catalogName="cat"
                          columnDataType="bigint"
                          columnName="id"
                          constraintName="teacher_subject_id_not_null"
                          tableName="teacher_subject"
                          validate="true"/>
    <dropDefaultValue tableName="teacher_subject" columnName="achieved" columnDataType="datetime"/>
</changeSet>