如何在liquibase变更集中设置多个外键?

时间:2019-10-29 17:07:10

标签: java jpa liquibase

我有一个包含两个表的联接表,其中一个表具有id作为主键,而另一个表具有3列作为主键,基本上是复合主键。 现在,在连接表上,我应该引用哪一列,或更准确地说,如何在编写变更集时将多列引用为外键。

以下是表格:

<changeSet id="Create X table">
 <createTable tableName="X">
  <column name="SERVICE" type="VARCHAR(50)">
    <constraints primaryKey="true"/>
  </column>
  <column name="ACTION" type="VARCHAR(50)">
    <constraints primaryKey="true"/>
  </column>
  <column name="TARGET" type="VARCHAR(50)">
    <constraints primaryKey="true"/>
  </column>
 </createTable>
</changeSet>

第二张表:

<changeSet id="Create Y table">
<createTable tableName="Y">
  <column name="ID" type="VARCHAR(36)">
    <constraints primaryKey="true" primaryKeyName="XPKY"/>
  </column>
  <column name="NAME" type="VARCHAR(50)">
    <constraints nullable="false" unique="true"/>
  </column>
</createTable>

已加入表格:

 <changeSet id ="Create X_Y_REL table">
<createTable tableName="X_Y_REL">
  <column name="Y_NAME" type="VARCHAR(50)">
    <constraints nullable="false" referencedTableName="Y" referencedColumnNames="NAME"
                 foreignKeyName="XFK1X_Y_REL"/>
  </column>
  <column name="X_ID" type="VARCHAR(150)">
    <constraints nullable="false" referencedTableName="X" referencedColumnNames="?????"
                 foreignKeyName="XFK2_X_Y_REL"/>
  </column>
</createTable>

因此,由于表X中没有单个主键列,因此我不知道在这里将什么作为引用列名。它的主键是复合键。

任何建议?

1 个答案:

答案 0 :(得分:0)

与Liquibase问题相比,这更多的是数据库设计问题,但这是我的想法。

您应该只向每个表添加一个整数或UUID列即可用作代理主键。从长远来看,这将使您和所有追随您的人都变得更轻松。然后,始终使用该键作为外键关系。

如果您还希望数据库强制要求某些列组合对于数据库的每一行也必须是唯一的,那么您也可以这样做,但这是一个单独的问题。

如果不想添加代理主键,则在第三个更改集中,可以引用组成复合键的多个列名称,并用逗号分隔。看起来像这样:

<changeSet id ="Create X_Y_REL table" author="Steve">
   <createTable tableName="X_Y_REL">
     <column name="Y_NAME" type="VARCHAR(50)">
       <constraints nullable="false" referencedTableName="Y" referencedColumnNames="NAME"
                    foreignKeyName="XFK1X_Y_REL"/>
     </column>
     <column name="X_ID" type="VARCHAR(150)">
       <constraints nullable="false" referencedTableName="X" referencedColumnNames="SERVICE,ACTION,TARGET"
                    foreignKeyName="XFK2_X_Y_REL"/>
     </column>
  </createTable>
</changeSet>