Sql 插入尚未存在的值-ORACLE/Postgres

Sql 插入尚未存在的值-ORACLE/Postgres,sql,oracle,postgresql,liquibase,Sql,Oracle,Postgresql,Liquibase,我已经在liquibase中回滚,如: <changeSet author="..." id="..."> <preConditions onFail="MARK_RAN"> <sqlCheck expectedResult="1"> ... </sqlCheck> </preConditions> <d

我已经在liquibase中回滚,如:

<changeSet author="..." id="...">
        <preConditions onFail="MARK_RAN">
            <sqlCheck expectedResult="1">
                ...
            </sqlCheck>
        </preConditions>
        <delete tableName="A">
            <where>ID = 'house'</where>
        </delete>
        <rollback>
            <insert tableName="A">
                <column name="ID" value="house" />
                <column name="TITLE" value="a" />
                <column name="TYPE" value="b" />
                <column name="VER" valueNumeric="c" />
            </insert>
        </rollback>
    </changeSet>
这个changset在3个不同的xml文件中运行,每个文件都是相同的

我需要提供自定义sql查询以进行回滚,因为它可能会引发关于向DB插入相同值的异常,所以我需要知道具有给定值的ID是否存在

我做过这样的事情:

<rollback>
            <sql dbms="oracle">
                insert into A(ID,TITLE,TYPE,VER)
                VALUES(house,a,b,c)
                where not exists (select ID from A where ID = 'house')
            </sql>
            <sql dbms="postgresql">
                ...
            </sql>
        </rollback>
我做过这样的东西,但不起作用。我也需要为博士后做这件事,我该怎么做?我只需要检查“A”表中是否存在具有给定值的ID

INSERT INTO A(ID,TITLE,TYPE,VER)
VALUES(house,a,b,c)
WHERE NOT EXISTS (SELECT 1 from A where ID = 'house')
应适用于postgres

使用SELECT作为源,而不是values子句:

对于博士后:

INSERT INTO A(ID,TITLE,TYPE,VER)
select 'house','a','b','c'
WHERE NOT EXISTS (SELECT 1 from A where ID = 'house');
对于Oracle:

INSERT INTO A(ID,TITLE,TYPE,VER)
select 'house','a','b','c'
from dual
WHERE NOT EXISTS (SELECT 1 from A where ID = 'house');

我检查了postgres的在线编译器,它抛出了42601:语法错误。你可以在什么地方发布链接,这样我就可以使用另一个解决方案?你可以保存你的工作并发送链接,所以我不需要重新创建你的工作。为什么我需要from dual语句?@mara122:因为Oracle不允许没有FROMOK的SELECT语句,正如我可以从你的回答中推断的那样,我不能也使用values子句?