Я использую запрос для получения списка таблиц с определенным именем столбца:

select name from sqlite_master where type='table' and sql like '%unique_col_id%';

Итак, он возвращает список имен таблиц, например table_1, table_2, table_3 ..

Я хотел бы удалить все строки в приведенных выше таблицах с unique_col_id, равным определенному значению:

DELETE FROM table_1 where unique_col_id=3;
DELETE FROM table_2 where unique_col_id=3;
DELETE FROM table_3 where unique_col_id=3;

Есть ли способ удалить всю таблицу одним запросом? Я хочу интегрировать оба запроса (поиск по таблице и удаление всех с unique_col_id = 3 ...)

Благодарность

7
Moti 8 Сен 2016 в 20:59

3 ответа

Лучший ответ

Хотя я уверен, что есть способ сделать все это в одном операторе, лучше использовать транзакции < / a> и / или триггеры.

Транзакция позволяет группировать несколько операторов вместе, чтобы ничего не сохранялось, пока они все не будут выполнены. Никакой другой процесс не увидит ваши изменения, пока транзакция не будет завершена. Если возникает ошибка или ваш процесс умирает в середине транзакции, все изменения удаляются. Это позволяет избежать множества проблем. Использование транзакций позволяет вам использовать простые инструкции, а не пытаться разбить все вместе в непослушный беспорядок.

begin;
DELETE FROM table_1 where unique_col_id=3;
DELETE FROM table_2 where unique_col_id=3;
DELETE FROM table_3 where unique_col_id=3;
commit;

Добавьте к этому триггеры. Это позволяет базе данных автоматически предпринимать действия, когда что-то происходит, например, когда вы удаляете столбец из одной таблицы, она может удалить связанную информацию из других таблиц. Наиболее типичный способ сделать это - установить ON DELETE CASCADE для внешних ключей.

# This is necessary in SQLite else foreign keys will be ignored
sqlite> pragma foreign_keys = on;

# Make two tables with a relationship and set it ON DELETE CASCADE
sqlite> create table addresses ( id INTEGER PRIMARY KEY, address TEXT, person REFERENCES people(id) ON DELETE CASCADE );
sqlite> create table people ( id INTEGER PRIMARY KEY, name TEXT );

# Add a row with a relationship.
sqlite> insert into people (name) VALUES ("Foo Bar");
sqlite> select * from people;
1|Foo Bar
sqlite> insert into addresses (address, person) VALUES ("123 Foo St", 1);
sqlite> select * from people join addresses on addresses.person = people.id;
1|Foo Bar|1|123 Foo St|1

# Delete the parent row and the child (address) is also deleted.
sqlite> delete from people where id = 1;
sqlite> select * from people;
sqlite> select * from addresses;

Это намного надежнее. Людям, вносящим изменения в вашу базу данных, не нужно знать все детали, база данных позаботится об этом за них.

9
Schwern 8 Сен 2016 в 18:29

Способ удаления всех таблиц

 public void dropAllTables() {
            // query to obtain the names of all tables in your database
            SQLiteDatabase db = this.getWritableDatabase();
            Cursor c = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null);
            List<String> tables = new ArrayList<>();

            // iterate over the result set, adding every table name to a list
            while (c.moveToNext()) {
                tables.add(c.getString(0));
            }

           // call DROP TABLE on every table name
            for (String table : tables) {
                String dropQuery = "DROP TABLE IF EXISTS " + table;
                db.execSQL(dropQuery);
            }
        }
0
Amir Dora. 6 Июл 2018 в 11:55

Здесь вам нужно сделать запрос транзакции, как показано ниже:

begin transaction 
delete from fkTable where fk = @id delete from pkTable where pk = @id 
commit
-2
OneCricketeer 8 Сен 2016 в 18:07