我使用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”声明中显示错误)
答案 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 ...
主键更新变得更加棘手