Liquibase以一对一的关系创建表模式

时间:2018-02-02 09:07:28

标签: sql postgresql liquibase

我正在尝试编写一个Liquibase脚本,该脚本将创建两个具有一对一关系的表。它没有例外:

ERROR: relation "owner" does not exist

我认为这是因为在创建CAR表时,OWNER表仍然不存在。

    <changeSet id="001" author="wesleyy">

        <createTable tableName="CAR">
            <column name="ID" type="bigint">
                <constraints primaryKey="true" nullable="false" />
            </column>

            <column name="OWNER_ID" type="bigint">
                <constraints 
                    foreignKeyName="OWNER_ID"
                    references="OWNER(ID)" />
            </column>
        </createTable>


        <createTable tableName="OWNER">
            <column name="ID" type="bigint">
                <constraints primaryKey="true" nullable="false" />
            </column>

            <column name="CAR_ID" type="bigint">
                <constraints 
                    foreignKeyName="CAR_ID"
                    references="CAR(ID)" />
            </column>
        </createTable>
    </changeSet>
</databaseChangeLog>

问题是:我正确使用外键引用吗?我如何在Liquibase中实现这一目标?

1 个答案:

答案 0 :(得分:1)

循环外键约束通常不是一个好主意。但如果你是100%,你需要那个。您需要先创建两个表,然后然后添加外键

<changeSet id="001" author="wesleyy">

  <createTable tableName="car">
      <column name="id" type="bigint">
          <constraints primaryKey="true" nullable="false" />
      </column>

      <column name="owner_id" type="bigint"/>
  </createTable>


  <createTable tableName="owner">
      <column name="id" type="bigint">
          <constraints primaryKey="true" nullable="false" />
      </column>

      <column name="car_id" type="bigint"/>
  </createTable>

  <addForeignKeyConstraint constraintName="fk_owner2car"
                          baseTableName="owner"
                          baseColumnNames="car_id"
                          referencedTableName="car"
                          referencedColumnNames="id"/>

  <addForeignKeyConstraint constraintName="fk_car2owner"
                          baseTableName="car"
                          baseColumnNames="owner_id"
                          referencedTableName="owner"
                          referencedColumnNames="id"/>

</changeSet>

无关,但是:

将Liquibase与Postgres一起使用时,不应以大写形式编写标识符。 Liquibase认为你需要区分大小写的大写标识符,并将所有这些标识符加倍引用,使它们区分大小写。使用带引号的标识符几乎总是比它们值得更麻烦。