在android sqlite数据库中删除前N行

use*_*909 14 sqlite android

请让我知道如何删除android sqlite数据库中的n行.我用过这段代码:

   String ALTER_TBL ="delete from " + MYDATABASE_TABLE +
         "where"+KEY_ID+"in (select top 3"+ KEY_ID +"from"+ MYDATABASE_TABLE+"order by _id );";

          sqLiteDatabase.execSQL(ALTER_TBL);
Run Code Online (Sandbox Code Playgroud)

但它显示错误.

03-21 13:19:39.217: INFO/Database(1616): sqlite returned: error code = 1, msg = near "in": syntax error
03-21 13:19:39.226: ERROR/Database(1616): Failure 1 (near "in": syntax error) on 0x23fed8 when preparing 'delete from detail1where_id in (select top 3_idfromdetail1order by _id );'.
Run Code Online (Sandbox Code Playgroud)

zap*_*apl 42

String ALTER_TBL ="delete from " + MYDATABASE_TABLE +
     " where "+KEY_ID+" in (select "+ KEY_ID +" from "+ MYDATABASE_TABLE+" order by _id LIMIT 3);";
Run Code Online (Sandbox Code Playgroud)
  • 在我知道的sqlite中没有"top 3"命令,你必须添加一个限制
  • 在将字符串添加到一起时注意空格: "delete from" + TABLE + "where" = "delete frommytablewhere"

此方法使用两个步骤删除前N行.

  1. 找到前N行:

    SELECT id_column FROM table_name ORDER BY id_column LIMIT 3

    结果是一个id列表,表示前N行(此处为3行).该ORDER BY部分很重要,因为SQLite不保证没有该子句的任何订单.如果没有ORDER BY该语句可以删除3个随机行.

  2. 从表中删除与id列表匹配的任何行:

    DELETE FROM table_name WHERE id_column IN ( {Result of step 1} )

    如果步骤1的结果为空,则不会发生任何事情,如果少于N行,则只删除这些行.

    重要的是要注意,id_column必须是唯一的,否则将删除超过预期的行.如果用于排序的列不唯一,则可以将整个语句更改为DELETE FROM table_name WHERE unique_column IN (SELECT unique_column FROM table_name ORDER BY sort_column LIMIT 3).提示:SQLite ROWIDunique_column删除表时的一个很好的候选者(在删除视图时可能不起作用 - 这里不确定).

要删除最后 N行,必须将排序顺序反转为descending(DESC):

DELETE FROM table_name WHERE unique_column IN (
    SELECT unique_column FROM table_name ORDER BY sort_column DESC LIMIT 3
  )
Run Code Online (Sandbox Code Playgroud)

要删除的N个到M 行中的LIMIT条款可以通过进行扩展OFFSET.下面的示例将跳过前两行并返回/删除下一行3.

SELECT unique_column FROM table_name ORDER BY sort_column LIMIT 3 OFFSET 2
Run Code Online (Sandbox Code Playgroud)

设置LIMIT为负值(例如LIMIT -1 OFFSET 2)将返回除前2行之外的所有行,导致删除除前2行之外的所有行 - 这也可以通过转换SELECT .. WHERE .. IN ()SELECT .. WHERE .. NOT IN ()


SQLite可以选择ORDER BY x LIMIT nDELETE没有子查询的情况下直接在语句中启用该部件.该选项未在Android上启用且无法激活,但在其他系统上使用SQLite的用户可能会对此感兴趣:

 DELETE FROM table_name ORDER BY sort_column LIMIT 3
Run Code Online (Sandbox Code Playgroud)