当前位置: 首页 > 知识库问答 >
问题:

通过带外键的Liquibase插入新记录

滑畅
2023-03-14

我使用Liquibase insert将两行添加到数据库中,并通过外键链接它们,如下所示:

<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>

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

表1:ID- 5522839049923041049862979858500642751,NAME-a值

表2:ID-424603463527923965688789950125407204,FK-(空)

这是表结构:

<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个答案

狄心水
2023-03-14

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

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

我知道这不是问题的确切答案,但我这样解决了我的问题。

卢子民
2023-03-14

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

 类似资料:
  • 问题内容: 我有桌子 我还有一张桌子 我要插入两个远程怪物:一个被称为 “弓箭妖精” ,攻击距离为 10 ,另一个被称为 “龙” ,攻击距离为 50 。我怎样才能在一条指令中做到这一点? 到目前为止,我已经尝试过了: 最坏的方法 这很不好,因为name列允许重复,并且检索到的记录可能不止一次。。。也不得不两次写出怪物的名字似乎不是一个好习惯。 插入…返回 如果表仅具有的列(外键),那么我可以使用以

  • 问题内容: 我有两个域,是一对多关系中的一部分。我想知道如何查询孩​​子的父母FK吗?贝娄是父母/孩子的伪代码 上级: 儿童: 尽管我没有明确创建FK,但是grails会自行创建MySQL数据库。但是,当我想像这样通过FK查询孩子时: 我收到一个错误:找不到类[class mgr.AlumLanguage]的名称[alumProfileId]的属性 关于如何做到这一点的任何建议? 谢谢杰森 问题答

  • 我的观点中有一个功能。py,它将数据插入表1,但表1中的一个字段是另一个表(称为表2)主键的外键。 注:-表2目前为空(无数据)。 现在,我只想检查数据是否正确地插入到表1中,因此,我跳过了Django ORM中的外键,但是我得到了类似“列中的Null值”name“违反了notnull约束”这样的错误 有人能告诉我一个绕过这个(或)任何新方法的方法吗。

  • 问题内容: 我有两个实体: 我正在尝试通过执行以下操作插入文件(以及随后的标签): 然后,我使用以下命令将文件插入DAO: 在我的日志中,我在“文件”表中看到一个插入,在标签表中看到2个插入,但是,指向我的文件表(file_id)的标签表中的外键为NULL。 我可能做错了什么? 问题答案: 您不是将标签的文件设置为文件,而是将标签的文件设置为文件。请记住,在OOP中,与关系模型相反,您必须设置关系

  • 描述:工作台中的autocommit值已设置为0(零),然后我将一条记录插入到表中,并通过jdbc在Java App客户端中成功提交了事务。我在命令行中执行select查询,刚刚插入的记录已成功提取,但在workbech中执行相同的查询脚本,无法提取刚插入的记录。只有在工作台中执行提交命令后,才能查询记录。 如何重复: 在mysql工作台中设置autocommit=0 通过jdbc从javaapp

  • 问题内容: 我有一个列表,例如:thing1,thing2,thing3。我想将它们插入具有相同外键的查找表中。因此理想情况下,它看起来应该像这样: 看来完成此操作的唯一方法是将列表转换为查询,但是我想知道,是否有更简单的方法? 这是我尝试过的: 我听说您无法在cfquery中执行cfloop,但是我什至不确定这是否成立,因为VALUES中没有逗号,并且我不确定如何说“ cfloop中的“当前迭代