2012-03-21 3 views
13

Пожалуйста, дайте мне знать, как удалить 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);'. 
+0

вы не можете использовать ВЕЬЕТЕ с выбора оператора в одном запросе. – Lucifer

+0

@ Lucifer на самом деле вы можете. Но вы не можете поместить удаление внутри выделения. см. http://www.sqlite.org/lang_expr.html выражение - это часть, которую вы можете положить после «где» – zapl

ответ

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

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

  1. Найти первые N строк:

    SELECT id_column FROM table_name ORDER BY id_column LIMIT 3

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

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

    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 строк порядок сортировки должен быть обратным по убыванию (DESC):

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

Для удаления N й М й строки в LIMIT может быть увеличена на OFFSET. Пример ниже будет пропустить первые 2 строки и возврата/удалить следующий 3.

SELECT unique_column FROM table_name ORDER BY sort_column LIMIT 3 OFFSET 2 

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


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

DELETE FROM table_name ORDER BY sort_column LIMIT 3 
+0

03-21 13: 26: 33.716: INFO/Database (1647): sqlite возвращен: код ошибки = 1 , msg = near "_id": ошибка синтаксиса 03-21 13: 26: 33.737: ERROR/Database (1647): ошибка 1 (около "_id": синтаксическая ошибка) на 0xd5cd0 при подготовке 'delete from detail1 где _id in (выберите _id from detail1order by _id LIMIT 3); '. – user933909

+0

добавьте недостающее пространство перед 'order'. У вас есть «detail1order» – zapl

+0

отлично ... Спасибо, он работает – user933909

2

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

"where"+KEY_ID+"in.. 

должны быть:

"where "+KEY_ID+" in... 

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

2

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

Int идентификатор;

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

String id;

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

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

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

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

} 
0

Вы можете использовать следующий режим: (в дополнение к ответу, предоставленному «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}) );** 

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

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

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

0

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

Delete from table WHERE id IN 
(SELECT id FROM table limit 100) 
Смежные вопросы