Я использую запрос для получения списка таблиц с определенным именем столбца:
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 ...)
Благодарность
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;
Это намного надежнее. Людям, вносящим изменения в вашу базу данных, не нужно знать все детали, база данных позаботится об этом за них.
Способ удаления всех таблиц
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);
}
}
Здесь вам нужно сделать запрос транзакции, как показано ниже:
begin transaction
delete from fkTable where fk = @id delete from pkTable where pk = @id
commit
Похожие вопросы
Связанные вопросы
Новые вопросы
sqlite
SQLite — это программная библиотека с открытым исходным кодом, которая реализует автономный, бессерверный, не требующий настройки транзакционный механизм базы данных SQL. SQLite — это наиболее распространенный в мире движок базы данных SQL.