当前位置: 首页 > 知识库问答 >
问题:

hsqldb与标识列合并

锺离明煦
2023-03-14

我有以下hsqldb数据库:

 CREATE TABLE t (id INT IDENTITY, code VARCHAR(10), description VARCHAR(100))
 INSERT INTO t (code, description) VALUES ('C1', 'dining table'), ('C2', 'deck chair')

我需要添加条目,只有当它们在表中不存在时。我希望在一个步骤中完成这项工作(而不是通过选择步骤来确定条目是否在表中,如果不是这样,则通过第二个步骤插入)

hsqldb对此具有合并操作。然而,问题是我有一个id-IDENTITY列,hsqldb应该自动负责设置值,我不知道如何告诉合并操作。

 MERGE INTO t USING (VALUES(3, 'C3', 'conference table')) 
   AS vals(x,y,z) ON t.code = vals.y
   WHEN NOT MATCHED THEN INSERT VALUES vals.x, vals.y, vals.z

这可以工作,但我必须给出id(3),我需要由hsqldb自动设置id(就像上面的插入操作一样)。我需要这样的东西:

 MERGE INTO t (code, description) USING (VALUES('C3', 'conference table')) 
   AS vals(x,y) ON t.code = vals.x
   WHEN NOT MATCHED THEN INSERT VALUES vals.x, vals.y

但此查询不起作用,因为合并操作不允许指定我正在处理的列“(代码,描述)”。

我如何实现它?

ps:http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_merge_statement

共有2个答案

丁学
2023-03-14

我没有尝试过,但这可能会奏效。

这是规格

MERGE INTO <target table> [ [ AS ] <merge correlation name> ] 
USING <table reference> ON <search condition>
<merge operation specification>

现在关注<代码>

它应该是带有的常规INSERT语句。为了让HSQL生成标识,您可以做两件事(同样是理论上的):

>

  • Ommit PK列

    INSERT [ <left paren> <insert column list> <paren right> ]
    [ <override clause> ] VALUES <merge insert value list>
    

    所以对你来说

    MERGE INTO t USING (VALUES(3, 'C3', 'conference table')) 
    AS vals(x,y,z) ON t.code = vals.y
    WHEN NOT MATCHED THEN INSERT (code,description) VALUES vals.y, vals.z
    

    使用标识()方法

    MERGE INTO t USING (VALUES(3, 'C3', 'conference table')) 
    AS vals(x,y,z) ON t.code = vals.y
    WHEN NOT MATCHED THEN INSERT VALUES identity(), vals.y, vals.z
    

    我将尝试检验这个假设,同时我需要类似的东西。

  • 漆雕稳
    2023-03-14

    请参阅插入文档。

    您可以使用关键字DEFAULT而不是值。这将插入列的默认值,或者如果该列定义为标识,则插入下一个生成的值。

     类似资料:
    • 问题内容: 在PostgreSql中,可以定义一个序列并将其用作表的主键。在HsqlDB中,仍然可以完成创建一个自动递增的标识列,该列不链接到任何用户定义的序列。是否可以将用户定义的序列用作HsqlDB中自动递增标识列的生成器? PostgreSql中的示例sql: HsqlDB中的等效项是什么? 谢谢。 问题答案: 在2.0版中,没有直接的功能。您可以在表上定义一个BEFORE INSERT触发

    • Google docu表示,工作负载标识可以用来授权GKE POD使用Google API提供的服务(而且效果很好)。它还表示,将有一个自动创建的标识池,名为PROJECT\u ID.svc。id.goog。 关于工作负载标识联合的Docu说:“您可以使用工作负载标识池来组织和管理外部标识。” 在我按照这里所述配置了工作负载标识(并且工作正常)之后,我正在尝试检索项目中现有的工作负载标识池,我希望

    • [我不是在问GIS Stackexchange,而是在问这个问题,因为这可能更像是SQL Server的问题?] 我有一个SQL Server ArcSDE连接,通过一些脚本批量插入数据。目前,只要有一行新的数据,“”列设置为,列就会增加1。到现在为止,一直都还不错。除了我需要在表上启用“版本控制”。 因此我遵循以下原则:http://resources.arcgis.com/en/help/ma

    • 问题内容: 我在OCJP for Java6的书中读到了带有断言的部分。我到达了那一部分,它概述了如果将“ assert”一词用作关键字或标识符时编译器的反应。 a 和an有什么区别?谁能给我一个简单的解释,并同时给我一个或多个例子? 问题答案: 术语“关键字”和“标识符”不是Java特定的。 关键字是Java关键字列表中的保留字,可为编译器提供指令。由于保留了关键字,因此程序员不能将其用于变量或

    • 问题内容: 我有一个熊猫DataFrame,其中包含一列,其中包含多个JSON数据项作为字典列表。我想规范化JSON列并复制非JSON列: 我想要 我可以使用以下方式标准化JSON数据: 但我不知道如何将其连接回原始DataFrame的id列。 问题答案: 您可以将with 与with 一起使用,用于提取列,删除第二层并恢复原始: 等同于:

    • 如何更改身份栏? 例如,我有一张表: 我需要随着时间的推移而改变