2016-09-08 5 views
2

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

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

Благодаря

+2

Зачем вам нужно делать это в одном запросе? Это что-то, что можно решить с помощью транзакций или [триггеров] (https://sqlite.org/lang_createtrigger.html)? – Schwern

+0

Я использую PHP как сервер, и производительность очень плохо, если я пытаюсь удалить несколько таблиц с несколькими запросами. – Moti

+1

Это то, что мы называем проблемой XY. Ваша проблема в X (производительность), но вы спросили о Y (ваша попытка решения X, которая может не быть решением и может ухудшить ситуацию). Есть много вещей, которые могут повлиять на вашу работу. Несколько простых запросов, вероятно, не проблема, возможно, это поиск по неиндексированным столбцам. Вместо этого вы должны спросить о своей проблеме производительности, возможно, в новом вопросе. Придумайте минимальный код, демонстрирующий проблему, и обязательно покажите свою схему SQL. – Schwern

ответ

5

Хотя я уверен, что вы можете сделать все это в одном заявлении, лучше использовать либо transactions, и/или triggers.

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

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 on your foreign keys.

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

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

+0

Спасибо, Сделки достаточно для меня – Moti

-2

Вы должны здесь сделать запрос транзакции, как это показано ниже:

begin transaction 
delete from fkTable where fk = @id delete from pkTable where pk = @id 
commit 
+0

Привет и добро пожаловать в StackOverflow! Я полагаю, что ваш ответ опускается по двум причинам. Во-первых, это не является действительным SQL; вы пропускаете точку с запятой? Во-вторых, ответы на код не поощряются; мы предпочитаем ответы с объяснениями, чтобы люди могли узнать, почему они делают что-то, а не просто вырезать и вставлять код. – Schwern

+0

Немного смущает, можете ли вы лучше объяснить свой ответ на этот вопрос? – RPichioli

Смежные вопросы