2013-03-19 102 views
4

我想从h2数据库(版本1.0.71)删除记录,但我得到一个查询语法错误。我执行的查询是:H2删除查询限制

DELETE FROM TABLE_NAME WHERE QUERY_FIELD LIKE '%somevalue%' LIMIT 1000; 

该错误消息我得到的是(而且这是不是对我很有帮助):

Syntax error in SQL statement DELETE FROM TABLE_NAME WHERE QUERY_FIELD LIKE '%somevalue%' LIMIT[*] 1000; 

LIMIT部分似乎是这个问题,是不是这在h2 1.0.71中支持?

当我执行类似SELECT查询:

SELECT * FROM TABLE_NAME WHERE QUERY_FIELD LIKE '%somevalue%' LIMIT 1000; 

它给了我预期的结果。 LIKELIMIT的组合是否有问题?

+0

DELETE语句只删除record.Instead你可以使用子查询。 – divyabharathi 2013-03-19 12:54:58

+0

是否可以升级到H2的更新版本?我找不到任何明确的,但似乎你可能不完全支持DELETE命令的版本。 – aaroncatlin 2013-03-19 13:10:40

+0

好吧,试过最新的h2版本(1.3.169),但是无法读取数据库格式。 – 2013-03-19 13:32:45

回答

2

你可以把SELECT声明这样的WHERE子句中:

DELETE 
FROM TABLE_NAME 
WHERE QUERY_FIELD LIKE '%somevalue%' 
AND id_field IN (SELECT id_field 
        FROM table_name 
        WHERE QUERY_FIELD LIKE '%somevalue%' 
        LIMIT 1000) 
+0

那么http://www.h2database.com/html/grammar.html#delete表明h2也应该支持限制。 – 2013-03-19 13:00:46

+0

尽量不要急于回答,然后再编辑它们。花些额外的时间来研究事实并确保你正在构建有用的回应。 – aaroncatlin 2013-03-19 13:00:46

+0

不是这样糟糕的建议,但这也不起作用:标量子查询包含多个行[90053-71] 90053/90053(帮助) – 2013-03-19 13:26:03

0

尝试

DELETE TOP 1000 FROM TABLE_NAME WHERE QUERY_FIELD LIKE '%somevalue%'; 
+1

当我尝试这个时,我收到消息:找不到表顶部。这很奇怪,因为http://www.h2database.com/html/grammar.html#delete表明这两种方法都应该起作用。 – 2013-03-19 13:00:09

+0

是的,这也是我看过的资源。我会看看我能否找到其他的东西。 – aaroncatlin 2013-03-19 13:02:32

0

升级到最新版本的H2,然后用LIMIT像你这样。

您使用的H2版本(1.0.71)大约5年,不再支持。要升级,请生成一个SQL脚本(使用SCRIPT语句),然后执行脚本。

+0

虽然这是一个完全有效的建议,但我受制于我工作的生产环境。我对使用哪个版本没有影响。随时转换数据库不是一种选择,因为它们往往很大。 – 2013-03-20 09:29:35

+0

好的,我添加了另一个答案(使用'ROWNUM')。 – 2013-03-20 15:08:34

1

这个解决方案应该与旧版本的H2甚至工作:

DELETE FROM TABLE_NAME 
WHERE QUERY_FIELD LIKE '%somevalue%' 
AND ROWNUM() < 1000; 
+0

是否有一个选项可以通过此删除语句添加订单? – 2015-11-23 14:22:31

+0

不,对不起,为此,您需要“where id_field in(select ...)”解决方案。 – 2015-11-24 13:16:18