Рассмотрим в продолжение курса статей по MySQL удаление записи в таблице и способы очистки самих таблиц. Для удаления определенных строк используется оператор DELETE. Таблицы могут очищаться тем же DELETE, а также с использованием TRUNCATE или DROP.
Структуру таблицы удалит только последний. Примеры для всех случаев приведены во второй части материала.
MySQL удаление записи в таблице
Сначала подготовим таблицу для демонстрации из которой будем удалять данные
CREATE TABLE PARTNERS (name VARCHAR(20), city VARCHAR(20), contact VARCHAR(20));
Ее структура следующая
describe PARTNERS;
+———+————-+——+——+———+——-+
| Field | Type | Null | Key | Default | Extra |
+———+————-+——+——+———+——-+
| name | varchar(20) | YES | | NULL | |
| city | varchar(20) | YES | | NULL | |
| contact | varchar(20) | YES | | NULL | |
+———+————-+——+——+———+——-+
3 rows in set (0.00 sec)
Наполним таблицу для того чтобы было с чем работать
INSERT INTO PARTNERS (name, city, contact)
VALUES ('Volna', 'Moscow', 'Alex');
Query OK, 1 row affected (0.01 sec)
INSERT INTO PARTNERS (name, city, contact)
-> VALUES ('TelecomInc', 'Tomsk', 'Nikolay');
Query OK, 1 row affected (0.01 sec)
INSERT INTO PARTNERS (name, city, contact)
-> VALUES ('Rizer', 'Vladivostok', 'Boris');
Query OK, 1 row affected (0.01 sec)
Используя самый простой SELECT можно посмотреть что получилось
select * from PARTNERS;
+————+————-+———+
| name | city | contact |
+————+————-+———+
| Volna | Moscow | Alex |
| TelecomInc | Tomsk | Nikolay |
| Rizer | Vladivostok | Boris |
+————+————-+———+
3 rows in set (0.00 sec)
Переходим к демонстрации того как происходит в MySQL удаление записи
Оператору DELETE передается имя таблицы, затем значения определенных полей, перечисленные в условии WHERE
delete from PARTNERS
WHERE name = 'Rizer»;
Query OK, 1 row affected (0.01 sec)
Снова просматриваем содержимое и видим, что последней добавленной записи не стало
select * from PARTNERS;
+————+———+———+
| name | city | contact |
+————+———+———+
| Volna | Moscow | Alex |
| TelecomInc | Tomsk | Nikolay |
+————+———+———+
2 rows in set (0.00 sec)
Если условия не указывать будет удалена вся таблица (ее содержимое без структуры)
delete from PARTNERS;
Query OK, 2 rows affected (0.01 sec)
select * from PARTNERS;
Empty set (0.00 sec)
Сейчас таблица пуста, структура сохранилась. В MySQL удаление записи производится только за счет DELETE, таблицы же могут удаляться и очищаться несколькими методами.
describe PARTNERS;
+———+————-+——+——+———+——-+
| Field | Type | Null | Key | Default | Extra |
+———+————-+——+——+———+——-+
| name | varchar(20) | YES | | NULL | |
| city | varchar(20) | YES | | NULL | |
| contact | varchar(20) | YES | | NULL | |
+———+————-+——+——+———+——-+
3 rows in set (0.00 sec)
MySQL очистка таблицы: DELETE, TRUNCATE, DROP
Особенность оператора DELETE, который использовали только что в том, что строки он удаляет по одной — можно даже добавить параметр LOW_PRIORITY — с ним удаление произойдет только тогда когда отработают все процессы, выполняющие какие-то действия с таблицами.
Механизм действия DELETE делает его очень медленным. Но DELETE позволяет удобно работать с транзакциями.
Вновь добавим те же значения в таблицу выполнив INSERT и попробуем другой метод
select * from PARTNERS;
+————+————-+———+
| name | city | contact |
+————+————-+———+
| Volna | Moscow | Alex |
| TelecomInc | Tomsk | Nikolay |
| Rizer | Vladivostok | Boris |
+————+————-+———+
3 rows in set (0.00 sec)
TRUNCATE PARTNERS;
Query OK, 0 rows affected (0.01 sec)
select * from PARTNERS;
Empty set (0.00 sec)
Как легко можно заметить TRUNCATE не сосчитал удаленные таблицы — так произошло потому, что он удаляет таблицу и воссоздает ее с той же структурой, но без каких-либо данных.
Данные удаляются безвозвратно (используя транзакционный механизм ROLLBACK как в случае с DELETE восстановить их уже не получится). TRUNCATE при этом работает значительно быстрее, чем DELETE и при работе с большими объемами информации лучше использовать его.
Структура, как уже говорилось, сохраняется
describe PARTNERS;
+———+————-+——+——+———+——-+
| Field | Type | Null | Key | Default | Extra |
+———+————-+——+——+———+——-+
| name | varchar(20) | YES | | NULL | |
| city | varchar(20) | YES | | NULL | |
| contact | varchar(20) | YES | | NULL | |
+———+————-+——+——+———+——-+
3 rows in set (0.01 sec)
Удалить таблицу полностью можно выполнив DROP TABLE (также используется и с базами данных)
DROP TABLE PARTNERS;
Query OK, 0 rows affected (0.00 sec)
select * from PARTNERS;
ERROR 1146 (42S02): Table 'REAL_ESTATE_AGENCY.PARTNERS' doesn't exist
Такой таблицы больше нет и если требуется продолжить работу потребуется снова ее создать указав имена всех полей и типы данных, которые будет для них использоваться.
Читайте про серверную оптимизацию настроек MySQL.