如果存在于Worklight数据库适配器中,则插入表或更新

时间:2014-07-07 03:56:12

标签: sql ibm-mobilefirst derby worklight-adapters

我使用IBM Worklight Studio 6.1开发我的混合应用程序并使用Apache Derby作为我的SQL。问题是我想插入表或更新数据库中是否存在密钥。我从这个问题得到了答案:Insert to table or update if exists (MySQL)。它适用于SQL Fiddle

但是当我在SQL Adapter中使用它时,它会向我显示此错误。

{
    "errors": [   
        "Runtime: Syntax error: Encountered \"ON\" at line 1, 
        column 71..\nPerformed query:\n
        INSERT INTO ACC_ID_KEY (PREFIXKEY, ELEMENT) \t\tVALUES (?, 0) 
        ON DUPLICATE KEY UPDATE ELEMENT = VALUES(ELEMENT) + 1"   
    ],
    "info": [
    ],
    "isSuccessful": false,
    "warnings": [
    ]
}

我不知道会发生什么......

即可。我尝试将 ELEMENT = VALUES(ELEMENT)+ 1 更改为 ELEMENT = ELEMENT + 1 ,但它仍然显示相同的错误
Ps2的即可。我试试这段代码,但它仍无法正常工作

IF(( SELECT A.ELEMENT
    FROM ACC_ID_KEY A
    WHERE A.PREFIXKEY = 'A01407') IS NULL)

BEGIN
    INSERT INTO ACC_ID_KEY (PREFIXKEY, ELEMENT)
    VALUES ('A01407', 1)
END

ELSE
    BEGIN
        UPDATE ACC_ID_KEY
        SET ELEMENT = ELEMENT + 1
        WHERE PREFIXKEY = 'A01407'
    END

PS3的即可。也是这个代码

CASE
WHEN (SELECT A.ELEMENT
    FROM ACC_ID_KEY A
    WHERE A.PREFIXKEY = 'A01407') IS NULL
THEN INSERT INTO ACC_ID_KEY (PREFIXKEY, ELEMENT)
    VALUES ('A01407', 1)
ELSE UPDATE ACC_ID_KEY
    SET ELEMENT = ELEMENT + 1
    WHERE PREFIXKEY = 'A01407'
END

(我发现Apache Derby可以使用Here中的CASE语句。我使用示例中的代码

CASE
    WHEN 1 = 2 THEN 3
    WHEN 4 = 5 THEN 6
ELSE 7
END

但是适配器仍然在“CASE”声明中显示错误)

1 个答案:

答案 0 :(得分:2)

INSERT或UPDATE或INSERT或IGNORE-like语法不是标准SQL,Derby不支持。

最新的Derby主干(尚未发布)包含SQL MERGE语句,它允许您完成许多相同的任务,但语法相当不同(在alpha手册中有解释)。

预计将在秋季初期发布包含这些功能的版本(10.11)。

直到那时的工作是这样的......

INSERT INTO T VALUES ... IF NOT EXISTS ( SELECT ... FROM T WHERE <k> = <value> )
UPDATE T SET <col> = CASE WHEN ...

主键更新变得更加棘手