如何在 liquibase 变更集中设置多个外键?
How to set multiple foreign keys in the liquibase changesets?
我有两个 table 的连接 table,其中一个有 id
作为主键,而另一个有 3 列作为主键,基本上是复合主键。
现在,在连接 table 上,我应该引用哪一列,或者更准确地说,如何在编写变更集时将多列引用为外键。
这里是 table:
<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>
第二个table:
<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>
已加入table:
<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>
所以,我不知道在这里放什么作为引用的列名,因为 table X 中没有单个主键列。它的主键是复合键。
有什么建议吗??
这更像是一个数据库设计问题,而不是 Liquibase 问题,但这是我对此的看法。
您可能应该只向每个 table 添加一个整数或 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>
我有两个 table 的连接 table,其中一个有 id
作为主键,而另一个有 3 列作为主键,基本上是复合主键。
现在,在连接 table 上,我应该引用哪一列,或者更准确地说,如何在编写变更集时将多列引用为外键。
这里是 table:
<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>
第二个table:
<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>
已加入table:
<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>
所以,我不知道在这里放什么作为引用的列名,因为 table X 中没有单个主键列。它的主键是复合键。
有什么建议吗??
这更像是一个数据库设计问题,而不是 Liquibase 问题,但这是我对此的看法。
您可能应该只向每个 table 添加一个整数或 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>