使用外键通过Liquibase插入新记录

时间:2015-09-25 12:45:41

标签: sql foreign-key-relationship sql-insert liquibase

我正在使用Liquibase插件向数据库添加两行,并通过外键将它们链接起来,如下所示:

<changeSet id="1.0.1" author="x">      
    <insert tableName="TABLE1">
        <column name="NAME" value="a value"/>
    </insert>
</changeSet>

<changeSet id="1.0.2" author="x">      
    <insert tableName="TABLE2">
        <column name="FK" valueComputed="(SELECT ID FROM TABLE1 WHERE NAME = 'a value')"/>
    </insert>
</changeSet>

两个记录都已正确插入,但TABLE2中的外键值除外。该值保持为空。所以似乎“computeValue”属性没有正确执行,但我不明白为什么。我希望在Liquibase中有一个解决方案而不是普通的SQL,因为Liquibase为我提供了轻松插入clob字段的可能性。

TABLE1: ID - 5522839049923041049862979858500642751, NAME - 值

TABLE2: ID - 4246034635279239656888789950125407204, FK - (null)

这是表结构:

<changeSet id="1.0.0" author="x">        
     <createTable tableName="TABLE1">
        <column name="ID" type="NUMBER (38)">
            <constraints primaryKey="true"/>
        </column>
        <column name="NAME" type="NUMBER (38)">
            <constraints nullable="false"/>
        </column>
    </createTable>
    <addUniqueConstraint columnNames="NAME" 
        constraintName="TABLE1_UK1" 
        tableName="TABLE1"/>

    <createTable tableName="TABLE2">
        <column name="ID" type="NUMBER (38)">
            <constraints primaryKey="true"/>
        </column>
        <column name="FK" type="NUMBER (38)">
            <constraints nullable="true"/>
        </column>
    </createTable>
    <addForeignKeyConstraint baseColumnNames="FK" 
        baseTableName="TABLE2" 
        constraintName="TABLE2_TABLE1_FK1" 
        referencedColumnNames="ID"
        referencedTableName="TABLE1"/>
</changeSet>

请注意,在两个表中的一个表中插入新记录时,触发器用于为名为ID的字段生成标识符(主键)。

2 个答案:

答案 0 :(得分:0)

也许你可以使用主键和外键的预定义值?

答案 1 :(得分:0)

如果使用序列,则可以使用当前值。您可以添加为所需表的最后一个条目创建的ID

<changeSet id="1.0.2" author="x">      
    <insert tableName="TABLE2">
        <column name="FK" valueSequenceCurrent="table_1_id_seq"/>
    </insert>
</changeSet>

我知道这不是解决问题的确切方法,但是我以这种方式解决了问题。