Sql 插入尚未存在的值-ORACLE/Postgres
我已经在liquibase中回滚,如: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
<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子句?