Удалить, усечь или удалить, чтобы очистить таблицу в MySQL - PullRequest
19 голосов
/ 08 апреля 2010

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

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

Ответы [ 6 ]

22 голосов
/ 08 апреля 2010

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

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

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

14 голосов
/ 08 апреля 2010

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

ALTER TABLE t2 AUTO_INCREMENT = value
4 голосов
/ 10 сентября 2012

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

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

2 голосов
/ 08 апреля 2010

Усеченная таблица - это то, что вы ищете http://www.1keydata.com/sql/sqltruncate.html

1 голос
/ 10 сентября 2012

Другая возможность включает создание пустой копии таблицы, установку 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;
0 голосов
/ 19 июня 2019

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

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

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

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

...