我正在尝试编写一个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中实现这一目标?
答案 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认为你需要区分大小写的大写标识符,并将所有这些标识符加倍引用,使它们区分大小写。使用带引号的标识符几乎总是比它们值得更麻烦。