Подтвердить что ты не робот

Удалить, усечь или удалить, чтобы очистить таблицу в MySQL

Я пытаюсь очистить таблицу, но не избавиться от фактической структуры таблицы. У меня есть столбец id, который автоматически увеличивается; Мне не нужно хранить идентификационный номер, но мне нужно, чтобы он сохранял свою автоматически увеличивающуюся характеристику. Я нашел удаление и усечение, но я обеспокоен тем, что один из них полностью удалит всю таблицу, в результате чего будущие команды вставки будут бесполезны.

Как удалить все записи из таблицы, чтобы я мог вставлять новые данные?

4b9b3361

Ответ 1

TRUNCATE будет reset вашим автоматически увеличивающимся семенем (по крайней мере, на таблицах InnoDB), хотя вы могли бы отметить его значение перед усечением и повторной установкой соответственно с помощью изменить таблицу:

ALTER TABLE t2 AUTO_INCREMENT = value

Ответ 2

drop table удалит всю таблицу с данными

delete * from table удалит данные, оставив значения автоинкремента в одиночку. это также занимает некоторое время, если в таблице много данных.

truncate table удалит данные, reset значения автоинкремента (но оставьте их в качестве столбцов автоинкремента, поэтому он начнется только с 1 и снова оттуда) и очень быстро.

Ответ 3

    Drop сделает именно это... отмените эту таблицу, если только таблица не является родителем для другой таблицы.

    Удалить удалит все данные, соответствующие условиям; если условие не указано, оно удалит все данные в таблице.

    Truncate похож на удалить; однако он сбрасывает счетчик auto_increment обратно на 1 (или начальное начальное значение). Тем не менее, лучше использовать truncate over delete, потому что delete удаляет данные по каждой строке, тем самым имея производительность, превышающую truncate. Однако truncate не будет работать в таблицах InnoDB, где применяется ссылочная целостность, если она не отключена до того, как выдается команда truncate.

    Итак, расслабьтесь; если вы не выполните команду drop в таблице, она не будет удалена.

Ответ 5

Другая возможность заключается в создании пустой копии таблицы, установке AUTO_INCREMENT (с некоторой возможной задержкой для вставок во время неатомной операции), а затем вращения обоих:

CREATE TABLE t2_new LIKE t2;

SELECT @newautoinc:=auto_increment /*+[leeway]*/ 
  FROM information_schema.tables
 WHERE table_name='t2';

SET @query = CONCAT("ALTER TABLE t2_new AUTO_INCREMENT = ", @newautoinc);
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

RENAME TABLE t2 TO t2_old, t2_new TO t2;

И тогда у вас есть дополнительное преимущество в том, что вы все еще можете изменить свое мнение, прежде чем удалять старую таблицу.

Если вы пересмотрите свое решение, вы можете вернуть старые записи из таблицы перед операцией:

INSERT /*IGNORE*/ INTO t2 SELECT * FROM t2_old /*WHERE [condition]*/;

Когда вы добры, вы можете отказаться от старой таблицы:

DROP TABLE t2_old;

Ответ 6

Я только что столкнулся с ситуацией, когда DELETE резко влияет на производительность SELECT по сравнению с TRUNCATE для полнотекстового запроса InnoDB.

Если я УДАЛЯЮ все строки, а затем снова заполняю таблицу (1 миллион строк), типичному запросу требуется 1 секунда, чтобы вернуться.

Если вместо этого я TRUNCATE таблицы, и заполнить ее точно так же, типичный запрос занимает 0,05 секунды, чтобы вернуться.

YMMV, но по какой-то причине для меня на MariaDB 10.3.15-MariaDB-log DELETE, похоже, разрушает мой индекс.