Удалить первые N строк в базе данных android sqlite

Пожалуйста, дайте мне знать, как удалить n-строки в базе данных android sqlite. Я использовал этот код:

   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);

Но это показывает ошибку.

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 );'.

Ответ 1

String ALTER_TBL ="delete from " + MYDATABASE_TABLE +
     " where "+KEY_ID+" in (select "+ KEY_ID +" from "+ MYDATABASE_TABLE+" order by _id LIMIT 3);";
  • в sqlite, о котором я знаю, нет команды "top 3", вам нужно добавить лимит
  • обратите внимание на пробелы, когда вы добавляете строки вместе: "delete from" + TABLE + "where" = "delete frommytablewhere"

Этот подход использует два шага для удаления первых N строк.

  • Найдите первые N строк:

    SELECT id_column FROM table_name ORDER BY id_column LIMIT 3

    Результатом является список идентификаторов, которые представляют первые N (здесь: 3) строки. Часть ORDER BY важна, поскольку SQLite не гарантирует никакого порядка без этого предложения. Без ORDER BY оператор может удалить 3 случайные строки.

  • Удалите любую строку из таблицы, которая соответствует списку идентификаторов:

    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 ROWID является хорошим кандидатом для unique_column при удалении по таблицам (может не работать при удалении по видам - ​​не уверен здесь).

Чтобы удалить N строк last, порядок сортировки должен быть отменен до нисходящего (DESC):

DELETE FROM table_name WHERE unique_column IN (
    SELECT unique_column FROM table_name ORDER BY sort_column DESC LIMIT 3
  )

Чтобы удалить строку N th в M th предложение LIMIT может быть расширено на OFFSET. Пример ниже пропустит первые 2 строки и вернет/удалит следующий 3.

SELECT unique_column FROM table_name ORDER BY sort_column LIMIT 3 OFFSET 2

Установка отрицательного значения LIMIT (например, LIMIT -1 OFFSET 2) приведет к возврату всех строк, кроме первых 2, что приведет к удалению всего, кроме первых двух строк, что также может быть выполнено путем поворота SELECT .. WHERE .. IN () в SELECT .. WHERE .. NOT IN ()


SQLite имеет параметр , чтобы включить часть ORDER BY x LIMIT n непосредственно в инструкции DELETE без подзапроса. Эта опция не включена на Android и не может быть активирована, но это может представлять интерес для людей, использующих SQLite в других системах:

 DELETE FROM table_name ORDER BY sort_column LIMIT 3

Ответ 2

Кажется, что вы пропустили несколько пробелов:

"where"+KEY_ID+"in..

должен быть:

"where "+KEY_ID+" in...

Кроме того, вам нужно использовать limit вместо верхнего:

Ответ 3

Я сделаю:

db.delete(MYDATABASE_TABLE, "KEY_ID > "+ value, null);

Ответ 4

вы можете попробовать этот код

int id;

public void deleteRow(int id) { 
  myDataBase.delete(TABLE_NAME, KEY_ID + "=" + id, null);
}

Идентификатор строки

public void deleteRow(String id) {  
      myDataBase.delete(TABLE_NAME, KEY_ID + "=\" " + id+"\"", null);
    }

Ответ 5

Это немного длинная процедура, но вы можете сделать это, как это

сначала получите столбец ids таблицы, из которого вы хотите удалить определенные значения

public Cursor KEY_IDS() {
    Cursor mCursor = db.rawQuery("SELECT KEYID " +
                                     " FROM MYDATABASE_TABLE ;", null);


            if (mCursor != null)
            {
            mCursor.moveToFirst();
            }

            return mCursor;
}

Соберите его в списке массивов

ArrayList<String> first = new ArrayList<String>();

cursor1 = db.KEY_IDS();
            cursor1.moveToFirst();
            startManagingCursor(cursor1);

            for (int i = 0; i < cursor1.getCount(); i++) {

                reciv1 = cursor1.getString(cursor1
                        .getColumnIndex(DBManager.Player_Name));

second.add(reciv1);

}

и запрос удаления огня

for(int i = 0 ;i<second.size(); i++)
{
db.delete(MYDATABASE_TABLE KEYID +"=" + second.get(i) , null);

}

Ответ 6

Вы можете использовать следующий режим: (в дополнение к ответу, предоставленному "zapl" ).

**DELETE FROM {Table-X} WHERE _ID NOT IN 
 (SELECT _ID FROM {Table-X} ORDER BY _ID DESC/ASC LIMIT (SELECT {Limit-Column} FROM {SpecificationTable})  );**

Где {tаблица-X} ссылается на таблицу, которую вы хотите удалить, _ID является основным уникальным столбцом DESC/ASC. Исходя из того, хотите ли вы удалить верхние записи или последние записи и, наконец, в предложении "LIMIT", мы предоставляем коэффициент "n", используя другой запрос, который вызывает в {Limit-Column} из { SpecificationTable}: содержит значение, против которого вы хотите их удалить.

Надеюсь, это поможет кому-то.

Счастливое кодирование.

Ответ 7

Удалить первые N (100) строк в базе данных sqlite

Delete from table WHERE id IN 
(SELECT id FROM table limit 100)