Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用复杂的WHERE语句更新Liquibase中的行_Sql_Oracle10g_Foreign Keys_Foreign Key Relationship_Liquibase - Fatal编程技术网

Sql 使用复杂的WHERE语句更新Liquibase中的行

Sql 使用复杂的WHERE语句更新Liquibase中的行,sql,oracle10g,foreign-keys,foreign-key-relationship,liquibase,Sql,Oracle10g,Foreign Keys,Foreign Key Relationship,Liquibase,我以前从未使用过Liquibase,只是不知道如何解决这个问题。我最近加入的项目是一个旧项目的翻拍,所以我们必须坚持使用一个旧数据库,它有一个设计糟糕的模式。数据库不使用外键约束,因此仍有指向不再存在的条目的条目。在我的案例中,这是一名医生在数据库中不存在的银行拥有银行账户。到目前为止,我的团队处理这些问题的方式是用NULL覆盖ID。因此,基本上我要做的是,当银行不存在时,将所有银行帐户ID设置为NULL。我为完成此任务而编写的SQL代码如下: UPDATE DOCTOR SET FK_BANK

我以前从未使用过Liquibase,只是不知道如何解决这个问题。我最近加入的项目是一个旧项目的翻拍,所以我们必须坚持使用一个旧数据库,它有一个设计糟糕的模式。数据库不使用外键约束,因此仍有指向不再存在的条目的条目。在我的案例中,这是一名医生在数据库中不存在的银行拥有银行账户。到目前为止,我的团队处理这些问题的方式是用NULL覆盖ID。因此,基本上我要做的是,当银行不存在时,将所有银行帐户ID设置为NULL。我为完成此任务而编写的SQL代码如下:

UPDATE DOCTOR SET FK_BANKID = NULL WHERE FK_BANKID NOT IN (SELECT ID FROM BANK);
我被告知要将该修复集成到我们的Liquibase变更集中,但我就是不知道怎么做。这就是我到目前为止所做的:

<?xml version="1.0" encoding="UTF-8"?>

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog 
                                       http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">
    <changeSet id="remove_fk_bankid" author="v7">
        <update tableName="DOCTOR">
            <column name="FK_BANKID" value="NULL" />
            <where>FK_BANKID NOT IN (SELECT ID FROM BANK)</where>
        </update>
    </changeSet>
</databaseChangeLog>

Liquibase更新运行时没有错误,但是当我在之后查看数据库时,没有任何更改。有没有人能告诉我如何解决这个问题?

我终于找到了问题所在。变更集本身实际上没有问题。当Liquibase更新数据库时,它会记录数据库中的所有变更集,以便已经执行的变更集不会再次执行。Liquibase保存更改集内容的散列,以便再次执行已更改的更改集。实际的问题是,当我第一次执行变更集时,数据库是干净的,因为我是使用以下SQL命令手动执行的:UPDATE DOCTOR SET FK_BANKID=NULL,其中FK_BANKID不在SELECT ID FROM BANK;中;。之后,我更改了一个医生行,并将银行ID设置为不存在的银行,然后再次执行变更集,只是为了测试变更集是否实际工作。因为Liquibase的日志中有我的变更集,所以它不会再次执行。因此,我无法看到数据库中的更改。我注意到,当我回滚所有更改并再次更新数据库时

为了使变更集完整,我还必须定义回滚,因为Liquibase无法自动回滚行更新。由于银行帐户的ID将永远丢失,我只添加了一个空的回滚命令:

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog 
                                       http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">
    <changeSet id="remove_fk_bankid" author="v7">
        <update tableName="DOCTOR">
            <column name="FK_BANKID" value="NULL" />
            <where>FK_BANKID NOT IN (SELECT ID FROM BANK)</where>
        </update>
        <rollback>
        </rollback>
    </changeSet>
</databaseChangeLog>

哦,顺便说一下,如果有帮助的话,我们正在使用Oracle 10g数据库。