HSQLDB 如果不存在则插入,如果存在则更新

Posted

技术标签:

【中文标题】HSQLDB 如果不存在则插入,如果存在则更新【英文标题】:HSQLDB insert if doesn't exists, update if exists 【发布时间】:2015-11-29 22:07:05 【问题描述】:

我的基于 HSQLDB (OpenOffice 3.3.0) 的数据库有问题。我正在尝试创建 SQL 命令,该命令将从源表中选择具有指定列的行并将其复制到目标表中,请记住,如果目标表中不存在记录,则应创建它,如果存在则应获取更新。请注意,我使用的是相当老的 HSQLDB 引擎,它不支持 MERGE 命令。

谢谢。

【问题讨论】:

"请注意,我使用的是相当老的 HSQLDB 引擎" 那你为什么不升级呢?您使用的是哪个版本? 如果我只能找出那个...看起来它是 Java Runtime Environment 1.6.0_20 附带的。我不想对引擎进行任何升级或更改,因为已经编写了相当多的代码,这些代码仅适用于这个特定版本的 OpenOffice。每当我尝试使用 MERGE 时,命令处理器都会向它抛出错误“Unexpected token: MERGE in statement [MERGE]”。我推断它只是不识别这个命令,因此 hsqldb 引擎是相当老的一个。 我认为即使使用 OO 3.3,您也可以使用 split database 连接到 HSQLDB 2.3.3。见forum.openoffice.org/en/forum/viewtopic.php?f=83&t=17567 我已经在使用 OO 界面的拆分数据库引擎。通过阅读此链接,发现可能存在一些兼容性问题,我真的不想长时间重新开发这个旧项目。 OpenOffice 附带的版本是 HSQLDB 1.8;文档位于hsqldb.org/doc/1.8/guide。我强烈怀疑您想要做的事情不能完全在可用的 SQL 中完成。你能用另一种语言编写一个宏来测试目标表,然后编写适当的 SQL(UPDATE 或 INSERT)并执行它吗? 【参考方案1】:

使用旧的 HSQLDB 1.8,您需要执行 INSERT 和 UPDATE。

INSERT INTO dest (SELECT * FROM SOURCE WHERE <your condition> EXCEPT (SELECT * FROM source JOIN dest ON source.id = dest.id WHERE <your condition>));

UPDATE dest SET (col1, col2) = (SELECT coln, colm FROM source WHERE source.id = dest.id) WHERE <your condition>

【讨论】:

感谢 sn-ps。第一个需要更正以下行以使其正常工作: INSERT INTO dest (SELECT * FROM SOURCE WHERE EXCEPT (SELECT * FROM source JOIN dest ON source.id = dest.id WHERE ));通过更新,我无法使其仅适用于一列,因为此 HSQLDB 不支持多列语法。尽管如此,这仍然是向前迈出的一大步!

以上是关于HSQLDB 如果不存在则插入,如果存在则更新的主要内容,如果未能解决你的问题,请参考以下文章

数据库:如果存在则“更新”如果不存在则插入 [重复]

Codeigniter 如果不存在则插入,如果不存在则更新

如果不存在则插入mysql,如果存在则不更新

SQL Select:如果存在则更新,如果不存在则插入 - 使用日期部分比较?

mysql判断一条记录是否存在,如果存在,则更新此语句,如果不存在,则插入

检查记录是不是存在,如果是,则“更新”,如果不“插入”