Удаление записи в MySQL, оператор DELETE


Рассмотрим в продолжение курса статей по 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.

Сказать спасибо