【问题标题】:Insert new record via Liquibase with foreign key使用外键通过 Liquibase 插入新记录
【发布时间】:2015-12-23 07:23:07
【问题描述】:

我正在使用 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 字段的可能性。

表 1: 编号 - 5522839049923041049862979858500642751, NAME - 一个值

表 2: 编号 - 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 的字段生成标识符(主键)。

【问题讨论】:

  • 值得让 Liquibase 使用 updateSql 参数显示生成的 SQL。这可能会为您提供有关它正在尝试做什么的线索。

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


【解决方案1】:

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

【讨论】:

  • 是的,这正是我现在使用的替代方案。但这不是首选的解决方案。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2020-06-20
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多