猿问

如何在 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 中没有单个主键列。它的主键是复合键。


有什么建议吗??


慕侠2389804
浏览 92回答 1
1回答

慕田峪4524236

这更像是一个数据库设计问题,而不是 Liquibase 问题,但这是我对此的想法。您可能应该只向每个表添加一个整数或 UUID 列以用作代理主键。从长远来看,这将使你和任何追随你的人的事情变得更容易。然后始终使用该键作为外键关系。如果您还希望数据库强制执行某些列组合对于数据库的每一行也必须是唯一的,您也可以这样做,但这是一个单独的问题。如果您不想添加代理主键,则在第三个变更集中,您可以引用组成复合键的多个列名称,并用逗号分隔它们。它看起来像这样:<changeSet id ="Create X_Y_REL table" author="Steve">&nbsp; &nbsp;<createTable tableName="X_Y_REL">&nbsp; &nbsp; &nbsp;<column name="Y_NAME" type="VARCHAR(50)">&nbsp; &nbsp; &nbsp; &nbsp;<constraints nullable="false" referencedTableName="Y" referencedColumnNames="NAME"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreignKeyName="XFK1X_Y_REL"/>&nbsp; &nbsp; &nbsp;</column>&nbsp; &nbsp; &nbsp;<column name="X_ID" type="VARCHAR(150)">&nbsp; &nbsp; &nbsp; &nbsp;<constraints nullable="false" referencedTableName="X" referencedColumnNames="SERVICE,ACTION,TARGET"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreignKeyName="XFK2_X_Y_REL"/>&nbsp; &nbsp; &nbsp;</column>&nbsp; </createTable></changeSet>
随时随地看视频慕课网APP

相关分类

Java
我要回答