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以上是关于HSQLDB 如果不存在则插入,如果存在则更新的主要内容,如果未能解决你的问题,请参考以下文章
SQL Select:如果存在则更新,如果不存在则插入 - 使用日期部分比较?