2010-04-08 3 views
16

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

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

ответ

14

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

ALTER TABLE t2 AUTO_INCREMENT = value 
+0

Хорошая точка, отмечающая семена автоинкремента! Я забыл упомянуть, что – 2010-04-08 16:19:58

+0

я вижу спасибо мужчине! –

18

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

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

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

+0

Для InnoDB 'TRUNCATE' не так быстро, потому что он делает DROP + CREATE внутренне. Усечение 200 небольших таблиц занимает несколько секунд в моей системе dev ... – Marki555

+1

Удаление данных - это полностью зарегистрированная операция. Усечение данных минимально регистрируется –

1

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

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

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

Смежные вопросы