DROP TABLE
Синтаксис
DROP [TEMPORARY] TABLE [IF EXISTS] [/*COMMENT TO SAVE*/]
tbl_name [, tbl_name] ...
[WAIT n|NOWAIT]
[RESTRICT | CASCADE]
Описание
DROP TABLE удаляет одну или несколько таблиц. У вас должна быть DROP привилегия для каждой таблицы. Все данные таблицы и определение таблицы удаляются, а также триггеры, связанные с таблицей, поэтому будьте осторожны с этим оператором! Если хотя бы одна из таблиц, указанных в списке аргументов, не существует, MariaDB возвращает ошибку, указывая имя несуществующих таблиц, которые не удалось удалить, но также удаляет все таблицы в списке, которые существуют.
Важно: При удалении таблицы права пользователя на таблицу не удаляются автоматически. См. GRANT.
Если другая нить использует таблицу в явном транзакции или транзакции с автоматическим подтверждением, тогда нить получает замочный механизм метаданных (MDL) на таблице. Оператор DROP TABLE будет ожидать в состоянии нити "Ожидание блокировки метаданных таблицы" состояние нити, пока MDL не будет освобожден. MDL освобождаются в следующих случаях:
- Если MDL получен в явной транзакции, то MDL будет освобожден по окончании транзакции.
- Если MDL получен в транзакции с автоматическим подтверждением, то MDL будет освобожден по окончании оператора.
- Транзакционные и нетранзакционные таблицы обрабатываются одинаково.
Обратите внимание, что для разнесенной таблицы DROP TABLE постоянно удаляет определение таблицы, все ее разделы и все данные, которые хранились в этих разделах. Также удаляется файл определения разбиения (.par), связанный с удаляемой таблицей.
Для каждой указанной таблицы DROP TABLE удаляет временную таблицу с этим именем, если она существует. Если она не существует, и ключевое слово TEMPORARY не используется, то удаляется нетранзакционная таблица с тем же именем, если она существует. Ключевое слово TEMPORARY гарантирует, что нетранзакционная таблица не будет случайно удалена.
Используйте IF EXISTS для предотвращения появления ошибки для таблиц, которые не существуют. Для каждой несуществующей таблицы при использовании IF EXISTS генерируется NOTE. См. SHOW WARNINGS.
Если внешний ключ ссылается на эту таблицу, то таблицу нельзя удалить. В этом случае необходимо сначала удалить внешний ключ.
RESTRICT и CASCADE позволяют упростить миграцию из других систем баз данных. В MariaDB они ничего не делают.
Комментарий перед именами таблиц (/*COMMENT TO SAVE*/) сохраняется в двоичном журнале. Это свойство может использоваться инструментами репликации для отправки внутренних сообщений.
Можно указать имена таблиц как db_name.tab_name. Это полезно для удаления таблиц из нескольких баз данных одним оператором. Подробности см. в разделе Квалификаторы идентификаторов.
Для использования DROP TABLE на нетранзакционных таблицах требуется привилегия DROP. Для временных таблиц привилегии не требуется, так как такие таблицы видны только для текущей сессии.
Примечание: DROP TABLE автоматически подтверждает текущую активную транзакцию, если вы не используете ключевое слово TEMPORARY.
С MariaDB 10.5.4 DROP TABLE надежно удаляет остатки таблиц внутри движка хранения, даже если файл .frm отсутствует. До этого отсутствие файла .frm приводило к ошибке оператора.
DROP TABLE в репликации
DROP TABLE обладает следующими характеристиками в репликации:
-
DROP TABLE IF EXISTSвсегда регистрируются. -
DROP TABLEбезIF EXISTSдля таблиц, которые не существуют, не записываются в двоичный журнал. - Удаление
TEMPORARYтаблиц в журнале предваряетсяTEMPORARY. Эти удаления регистрируются только при выполнении репликации в режиме операторного или смешанного режима. - Один оператор
DROP TABLEможет быть записан с использованием до 3 различных операторовDROP:-
DROP TEMPORARY TABLE list_of_non_transactional_temporary_tables -
DROP TEMPORARY TABLE list_of_transactional_temporary_tables -
DROP TABLE list_of_normal_tables
-
DROP TABLE на первичном сервере обрабатывается на реплике как DROP TABLE IF EXISTS. Вы можете изменить это, установив slave-ddl-exec-mode в STRICT.
Удаление внутренней таблицы #sql-...
Начиная с MariaDB 10.6, DROP TABLE атомен и следующее не применяется. До MariaDB 10.5, если процесс mariadbd/mysqld убивается во время ALTER TABLE, вы можете найти таблицу с именем #sql-... в каталоге данных. В MariaDB 10.3 InnoDB-таблицы с этим префиксом будут удалены автоматически во время запуска. Начиная с MariaDB 10.4, эти временные таблицы всегда будут удалены автоматически.
Если вы хотите удалить одну из этих таблиц явно, вы можете сделать это, используя следующий синтаксис:
DROP TABLE `#mysql50##sql-...`;
При запуске ALTER TABLE…ALGORITHM=INPLACE по перестроению таблицы InnoDB создаст внутреннюю таблицу #sql-ib. До MariaDB 10.3.2 для этих таблиц файл .frm будет называться по-другому. Для удаления такой таблицы после сбоя сервера необходимо переименовать файл #sql*.frm в соответствии с файлом #sql-ib*.ibd.
Начиная с MariaDB 10.3.3, для промежуточной копии таблицы используется то же имя, что и для файла .frm. Имена #sql-ib используются операциями TRUNCATE и отложенным DROP.
Начиная с MariaDB 10.2.19 и MariaDB 10.3.10, таблицы #sql-ib будут удаляться автоматически.
Удаление всех таблиц в базе данных
Лучший способ удалить все таблицы в базе данных — выполнить DROP DATABASE, который удалит саму базу данных и все таблицы в ней.
Однако, если вы хотите удалить все таблицы в базе данных, но сохранить саму базу данных и другие объекты, кроме таблиц, то вам нужно будет выполнить DROP TABLE для удаления каждой таблицы по отдельности. Эти команды DROP TABLE можно сгенерировать, обратившись к таблице TABLES в базе данных information_schema. Например:
SELECT CONCAT('DROP TABLE IF EXISTS `', TABLE_SCHEMA, '`.`', TABLE_NAME, '`;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'mydb';
Атомное удаление таблицы
Начиная с MariaDB 10.6, DROP TABLE для одной таблицы атомарна (MDEV-25180) для большинства движков, включая InnoDB, MyRocks, MyISAM и Aria.
Это означает, что в случае сбоя (сбой сервера или отключение питания) во время DROP TABLE, все таблицы, обработанные до этого момента, будут полностью удалены, включая связанные файлы триггеров и записи состояния, а в двоичный журнал будет включен оператор DROP TABLE для удаленных таблиц. Таблицы, для которых операция удаления еще не началась, останутся неизменными.
В более старых версиях MariaDB была небольшая вероятность того, что во время сбоя сервера в середине DROP TABLE, некоторые движки хранения, которые использовали несколько файлов хранения, такие как MyISAM, могли иметь только часть своих внутренних файлов удаленных.
В MariaDB 10.5, DROP TABLE было расширено, чтобы иметь возможность удалять таблицу, которая была удалена только частично (MDEV-11412), как описано выше. Атомное DROP TABLE — это последний компонент, позволяющий DROP TABLE стать полностью надежным.
Удаление нескольких таблиц безопасно при сбоях.
Дополнительную информацию см. в разделе Атомные DDL.
Примеры
DROP TABLE Employees, Customers;
Примечания
Обратите внимание, что DROP TABLE может удалять как таблицы, так и последовательности. Это делается в основном для того, чтобы старые инструменты, такие как mariadb-dump (ранее mysqldump), могли работать с последовательностями.
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/drop-table/