Когда вы работаете с базой данных MySQL, в нескольких ситуациях вы можете удалить существующие записи из одной или нескольких таблиц.
На этом уроке мы расскажем, как использовать DELETE в MySQL с некоторыми полезными примерами.
Рассматриваются в данном руководстве следующие примеры:
Для удаления записей из таблицы, вы должны иметь привилегию DELETE на конкретной таблице, из которой вы пытаетесь удалить строки.
Для этого урока мы будем использовать следующую таблицу сотрудников в качестве примера.
MariaDB [tgs]> SELECT * FROM worker; +-----+----------+------------+--------+ | id | name | dept | salary | +-----+----------+------------+--------+ | 100 | AndreyEx | Sales | 5000 | | 200 | Boris | IT | 5500 | | 300 | Anna | IT | 7000 | | 400 | Anton | Marketing | 9500 | | 500 | Dima | IT | 6000 | +-----+----------+------------+--------+
Если вы новичок в MySQL, вероятно, вы должны сначала понять основы MySQL, включая, как создать базу данных MySQL.
Чтобы удалить определенную строку, вы должны указать условие, при котором с помощью одного из значения столбцов первичного или уникального значения столбца.
Следующий пример удаляет одну запись из таблицы сотрудников, который имеет идентификатор 100.
MariaDB [tgs]> DELETE FROM worker WHERE id = 100; Query OK, 1 row affected (0.01 sec)
В приведенном выше выводе:
Первая запись с идентификатором 100 будет удалена из таблицы сотрудников.
MariaDB [tgs]> SELECT * FROM worker; +-----+-------+------------+--------+ | id | name | dept | salary | +-----+-------+------------+--------+ | 200 | Boris | IT | 5500 | | 300 | Anna | IT | 7000 | | 400 | Anton | Marketing | 9500 | | 500 | Dima | IT | 6000 | +-----+-------+------------+--------+
Вы можете удалять записи из таблицы путем сопоставления столбца строки с определенными критериями.
Для строки, вы можете использовать ключевое слово “like”, который будет делать частичное соответствие. Для частичного соответствия используется % в столбце значений.
В следующем примере будем удалять записи из таблицы сотрудников, где значение в столбце DEPT начинается с “Tech”. Таким образом, это удалит все записи, где отдел “IT”.
MariaDB [tgs]> DELETE FROM worker WHERE dept LIKE 'IT%'; Query OK, 3 rows affected (0.00 sec)
Приведенный выше вывод указывает на то, что он удалил 3 записи. Как мы видим из следующего выхода, мы не видим больше записей отдела “IT”.
MariaDB [tgs]> SELECT * FROM worker; +-----+----------+-----------+--------+ | id | name | dept | salary | +-----+----------+-----------+--------+ | 100 | AndreyEx | Sales | 5000 | | 400 | Anton | Marketing | 9500 | +-----+----------+-----------+--------+
Мы обсуждали много о различных практических условиях команды WHERE в нашем MySQL учебнике. Это очень полезно, чтобы понять, как эффективно использовать предложение WHERE во время удаления: 25 Основных примеров команды WHERE в MySQL.
Аналогично в приведенном выше примере номера столбца, вы можете также удалять записи из таблицы путем сопоставления столбца строке с определенными критериями.
Ниже будем удалять записи из таблицы сотрудников, где зарплата меньше или равна 700.
MariaDB [tgs]> DELETE FROM worker WHERE salary <=7000; Query OK, 4 rows affected (0.00 sec)
Вышеуказанная команда удалила 4 записи из нашей таблицы сотрудников. У нас в настоящее время осталась только одна запись.
MariaDB [tgs]> SELECT * FROM worker; +-----+-------+-----------+--------+ | id | name | dept | salary | +-----+-------+-----------+--------+ | 400 | Anton | Marketing | 9500 | +-----+-------+-----------+--------+
Даже тогда, когда соответствует много записей, вы все еще можете ограничить, сколько записей следует удалить с помощью опции LIMIT.
Это очень полезно, когда команда удаления занимает очень много времени, и вы хотите разорвать операцию удаления на несколько кусков. Например, при удалении более 100 000 записей, вы можете использовать LIMIT 10000, чтобы удалить только 10000 записей в один момент.
Например, следующая команда удаления без какой-либо опции LIMIT будут удалять все соответствующие записи. т.е. этот удалила 5 записей.
MariaDB [tgs]> DELETE FROM worker WHERE id > 1 ; Query OK, 5 rows affected (0.00 sec)
Но когда вы используете опцию LIMIT, то следующим будут удалять только 2 записи, даже если запросу соответствует 5 записей.
MariaDB [tgs]> DELETE FROM worker WHERE id > 1 LIMIT 2; Query OK, 2 rows affected (0.01 sec)
Выполнить ту же команду удаления еще раз, что приведет к удалению больше 2 записей.
MariaDB [tgs]> DELETE FROM worker WHERE id > 1 LIMIT 2; Query OK, 2 rows affected (0.00 sec)
При выполнении его снова, на этот раз он удаляется только одну запись, так как это последний совпадающие записи.
MariaDB [tgs]> DELETE FROM worker WHERE id > 1 LIMIT 2; Query OK, 1 row affected (0.00 sec)
Теперь у нас нет каких-либо более совпадающих записей для удаления.
MariaDB [tgs]> DELETE FROM worker WHERE id > 1 LIMIT 2; Query OK, 0 rows affected (0.00 sec)
Если вы хотите удалить все строки из таблицы, вы можете использовать либо команду DELETE или команду TRUNCATE, как показано ниже. Оба будут делать то же самое. Но есть разница.
MariaDB [tgs]> DELETE FROM worker; Query OK, 5 rows affected (0.00 sec) (или) MariaDB [tgs]> TRUNCATE TABLE worker; Query OK, 0 rows affected (0.00 sec)
Ниже приведены несколько вещей, которые вы должны знать о DELETE против TRUNCATE:
Вы можете использовать ключевое слово IGNORE вместе с командой DELETE (т.е. DELETE IGNORE), когда вы хотите игнорировать реальное действительное сообщение об ошибке, если вы знаете, ваша конкретная команда DELETE будет сбрасывать.
Таким образом, когда вы используете DELETE IGNORE, если есть любое действительное сообщение об ошибке, он будет рассматриваться только как предупреждение. Вы должны быть очень осторожны, когда вы используете DELETE IGNORE, особенно в таблице, где у вас есть внешний ключ, так как DELETE IGNORE просто удалит записи, не беспокоясь о каких-либо внешних зависимостей внешнего ключа.
MariaDB [tgs]> DELETE IGNORE FROM contractorbenefits WHERE id > 200; Query OK, 3 rows affected, 1 warning (0.01 sec)
Как видно из приведенного выше вывода, DELETE IGNORE удалит записи из таблицы, даже если существует зависимость внешнего ключа. Он просто выведет те реальные сообщение об ошибке как предупреждения.
Вы можете использовать Order вместе с командой Delete.
Это может быть очень полезно, если вы хотите, чтобы ваши строки будут удалены в определенном порядке.
В команде удаления, когда вы объединяете “order by” и опцию “limit”, вы можете сделать некоторые трюки.
Например, при выполнении следующей команды удаления без “order by”, удалит запись сотрудника с кодом 100 (т.е. самого старого сотрудника в отделе «IT»).
MariaDB [tgs]> DELETE FROM worker WHERE dept = 'IT' LIMIT 1; Query OK, 1 row affected (0.00 sec)
Приведенная выше команда удалила идентификационный номер сотрудника 200 (самый старый работник IT).
MariaDB [tgs]> SELECT * FROM worker; +-----+----------+------------+--------+ | id | name | dept | salary | +-----+----------+------------+--------+ | 100 | AndreyEx | Sales | 5000 | | 300 | Anna | IT | 7000 | | 400 | Anton | Marketing | 9500 | | 500 | Dima | IT | 6000 | +-----+----------+------------+--------+
Но, вы можете также удалить нового сотрудника в отделе «IT», если объединить и упорядочить по LIMIT, как показано ниже.
MariaDB [tgs]> DELETE FROM worker WHERE dept = 'IT' ORDER BY id DESC LIMIT 1; Query OK, 1 row affected (0.00 sec)
Приведенная выше команда удалила идентификационный номер сотрудника 500 (самый новый работник IT).
MariaDB [tgs]> SELECT * FROM worker; +-----+----------+------------+--------+ | id | name | dept | salary | +-----+----------+------------+--------+ | 100 | AndreyEx | Sales | 5000 | | 200 | Boris | IT | 5500 | | 300 | Anna | IT | 7000 | | 400 | Anton | Marketing | 9500 | +-----+----------+------------+--------+
Кроме того, имейте в виду, что вы можете использовать ORDER BY в предложении, если вы хотите удалить записи в определенной последовательности, чтобы избежать каких-либо ограничений ссылочной целостности.
В огромной таблице, которая имеет некоторые индексы, вы можете использовать быстрый вариант для ускорения операции удаления, как показано ниже.
MariaDB [tgs]> DELETE QUICK FROM worker WHERE id > 200; Query OK, 3 rows affected (0.00 sec)
В Delete, когда вы используете быстрый вариант, это не слияние индексов, которые могут Ускорить операцию удаления в зависимости от вида индексов, которые есть у вас в таблице.
Низкий приоритет очень полезен, когда вы пытаетесь удалить записи из таблицы, которая слишком большая.
Ключевое слово LOW_PRIORITY будет эффективным только на этих двигателях хранения: MyISAM, MEMORY и MERGE. т.е. Вы можете использовать эту функцию только на двигателях для хранения базы данных, которые реализуют блокировки на уровне таблицы.
MariaDB [tgs]> DELETE LOW_PRIORITY FROM worker WHERE dept IN ('Sales', 'Marketing'); Query OK, 2 rows affected (0.01 sec)
При использовании ключевого слова LOW_PRIORITY, операция удаления будет происходить только тогда, когда никто не читает из таблицы.
Во всех предыдущих примерах мы использовали команду удаления, чтобы удалить только записи из одной таблицы.
Есть два способа. когда можно указать удаление записей из нескольких таблиц.
В первом способе, можно указать таблицы, из которых записи будут удалены перед ключевым словом “FROM”, как показано ниже. Ниже будут удалены записи из worker и benefits таблиц, которые соответствуют критериям, указанным в условии where.
DELETE worker, benefits FROM worker INNER JOIN benefits INNER JOIN contractor WHERE worker.id=benefits.id AND benefits.id=contractor.id;
Во втором способе, можно указать таблицы, где записи будут удалены, после ключевого слова “FROM”, как показано ниже. Ниже будет удалять записи из worker и benefits, которые соответствуют критериям, указанным в условии where.
DELETE FROM worker, benefits USING worker INNER JOIN benefits INNER JOIN contractor WHERE worker.id=benefits.id AND benefits.id=contractor.id;