24 янв. 2011 г.

Удаление одним запросом записи в нескольких таблицах (MySQL)

Для того чтобы вывести эту информацию единой в едином виде придется произвести объединение выдачи:


SELECT
tablesql.active, tablesql.id, tablesql_text.text_table
FROM
tablesql
INNER JOIN tablesql_text ON tablesql.id = tablesql_text.table_id








Предположим у нас есть две таблицы в БД MySQL :
Таблица tablesql:


CREATE TABLE tablesql (
id INT (11) NOT NULL AUTO_INCREMENT,

active TINYINT (1) DEFAULT 0,
PRIMARY KEY (id)

)
ENGINE = MYISAMAUTO_INCREMENT = 1
CHARACTER SET utf8
COLLATE utf8_general_ci;


Таблица tablesql_text


CREATE TABLE tablesql_text(
id INT (11) NOT NULL AUTO_INCREMENT,

table_id INT (11) DEFAULT NULL,
text_table VARCHAR (100) DEFAULT NULL,

PRIMARY KEY (id)
)
ENGINE = MYISAMAUTO_INCREMENT = 1

CHARACTER SET utf8
COLLATE utf8_general_ci;:


Эти таблицы логически связаны друг с другом по средством ключей tablesql.id и tablesql_text.id и содержат в себе единую информацию.

Информация в таблицах:



INSERT INTO  tablesql (`id` ,`active`)

VALUES (NULL , '1'), (NULL , '0');

 INSERT INTO  tablesql_text (`id` ,`table_id` ,`text_table`)
VALUES (NULL , '1', 'запись номер 1'), (NULL , '2', 'запись номер 2');


Для того чтобы вывести эту информацию единой в едином виде придется произвести объединение выдачи:


SELECT
tablesql.active, tablesql.id, tablesql_text.text_table
FROM
tablesql
INNER JOIN tablesql_text ON tablesql.id = tablesql_text.table_id


Во время единовременного удаления записей из различных таблиц будет выполнено нечто подобное:


DELETE tablesql, tablesql_textFROM
tablesql, tablesql_textWHERE

tablesql.id = tablesql_text.table_id AND tablesql.id = 1


Теперь давайте рассмотрим механизм удаления подробнее:

Первая строка:


DELETE tablesql, tablesql_text


Выбираем из каких таблиц мы будем удалять данные
Вторая и третья строка:


FROM
tablesql, tablesql_text


Выбираем на основе каких таблиц мы будем удалять данные
Четвертая и пятая строка:


WHERE
tablesql.id = tablesql_text.table_id AND tablesql.id = 1


tablesql_text – обозначение таблицы .table_id – обозначение поля в таблице


Условия связи между таблицами (tablesql.id = tablesql_text.table_id) и id конкретой записи в таблице tablesql (tablesql.id = 1)
А ведь раньше я удалял из каждой таблице поэтапно, т.е. если у Вас связаны три таблицы, то это три запроса. Тут важно помнить, что нагрузка формируется не за счет объема данных в аналогичных запросах, а за счет количества этих запросов.