У меня есть 100 таблиц, 40 000 строк в каждой таблице. Я хочу войти в MySQL и удалить все строк от все столов.Удалить данные из всех таблиц в MYSQL
... в 1 заявлении, если возможно?
Я хочу сохранить базу данных и таблицы.
У меня есть 100 таблиц, 40 000 строк в каждой таблице. Я хочу войти в MySQL и удалить все строк от все столов.Удалить данные из всех таблиц в MYSQL
... в 1 заявлении, если возможно?
Я хочу сохранить базу данных и таблицы.
Я так не думаю (но раньше я был неправ). То, что я обычно делаю, - это два этапа.
Если СУБД имеет интерфейс командной строки, вы можете использовать его, чтобы создать сценарий, чтобы сделать большую часть работы, что-то вроде:
db2 "select 'db2 delete from ' | tblname from sysibm.systables
where owner = 'pax'" >p2.sh
p2.sh
Первый бит просто создает p2.sh
файл (или p2.cmd
файл под Windows), содержащий оператор delete from
для каждой таблицы, принадлежащей pax
. Затем вы запускаете этот командный файл для выполнения грязной работы. Конечно, вы можете проверить это, конечно :-)
Не одноэтапный процесс, который вы искали, но все еще очень прост. Я предполагаю, что mysql также имеет интерфейс командной строки.
Update:
версия MySQL из выше выглядит, как это должно быть:
echo "select 'mysql truncate table ' | table_name
from information_schema.tables" | mysql >p2.sh
bash p2.sh
Это использует truncate
команду, которая, как правило, более эффективно, чем delete from
для удаления всех строк. Он также использует правильные системные таблицы MySQL для получения имен таблиц.
В одном случае - вы можете поместить предложение where
, которое позволяет ограничить таблицы теми, которые вы хотите удалить. В качестве запроса он будет удалять каждую таблицу. Одна из возможностей - ограничить его конкретными значениями table_schema
и/или table_type
.
Это возможно, но у него есть побочные эффекты, которые не могли бы:
drop database <dbname>;
Это означает, что структуры таблиц, будут удалены, а также индексы, хранимые процедуры и т.д., и т.д.
единственный способ будет написать хранимую процедуру, которая закругляется как-то с
truncate table <tablename>;
Я хочу, чтобы сохранить базу данных и таблицы. – TIMEX
только предположение ... попробовать это
TRUNCATE TABLE *;
Или
TRUNCATE TABLE table1, table2, Таблица3;
Или
DELETE FROM table1, table2, Table3 WHERE 1 = 1;
Это потребует хранимую процедуру или сценарий, который перебирает каждую таблицу и делает:
truncate table <tablename>
Чтобы получить список таблиц укоротить вы можете сделать что-то вроде:
SELECT table_name
FROM INFORMATION_SCHEMA.tables
WHERE table_schema = 'db_name'
+1: вы бы хотели использовать подготовленное заявление, чтобы выполнять итерацию по таблицам: http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html –
Самый простой способ усечения всех таблиц при сохранении схемы.
mysqldump -d -uuser -ppass --add-drop-table databasename > databasename.sql
mysql -uuser -ppass databasename < databasename.sql
Не уверен, что если он сохранит хранимые процедуры, поскольку они не используются, где я работаю, но я использую это регулярно, чтобы восстановить базы данных.
Коммутатор -d
на mysqldump означает «не сбрасывать данные».
--add-drop-table
добавляет инструкцию DROP TABLE к каждой CREATE TABLE в дампе.
это работает, но осторожность !!!! он устраняет все ограничения внешнего ключа. – mickeymoon
Экспортировать SQL-скрипт, удалять базу данных, воссоздавать базу данных по сценарию. :)
$ mysqldump --no-data -u [username] -p[password] [database] > [location]
$ mysql -u [username] -p[password]
mysql > drop database [database]; create database [database];
mysql > exit;
$ mysql -u [username] -p[password] [database] < [location]
Переключатель --no-data
сохраняет только информацию таблицы базы данных, и будет игнорировать все данные таблицы; вам просто нужно переименовать созданный файл .sql
, чтобы восстановить всю информацию о таблице.
Это две строки сценария лучше ... попробуйте
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'DELETE FROM ?'
GO
Это не сработает для MySQL. – Lunc
DELIMITER $$
DROP PROCEDURE IF EXISTS `cleanAllTables`$$
CREATE DEFINER=`root`@`%` PROCEDURE `cleanAllTables`()
BEGIN
DROP Temporary TABLE IF EXISTS AllTables;
Create Temporary Table AllTables (
SELECT @curRow := @curRow + 1 AS row_number
, table_name
FROM INFORMATION_SCHEMA.tables s
JOIN (SELECT @curRow := 0
) r
WHERE s.table_schema = 'databasename');
set @countOfAllTables = (select count(*) from AllTables);
set @c = 1;
WHILE @c<[email protected] DO
set @table_name = (select table_name from AllTables where row_number = @c);
set @stmt = concat('Truncate Table ', @table_name);
Prepare stmt from @stmt;
Execute stmt;
SET @c = @c + 1 ;
END WHILE ;
END$$
DELIMITER ;
и obvioulsy после создания этой процедуры вы будете писать call cleanAllTables; – Machoo
Это один работает для меня в MySQL 5, и это относится только к таблицам:
echo 'show tables' | mysql --skip-column-names -u root YOUR_DB | awk '{print "truncate table " $0 ";"}' | mysql -u root YOUR_DB
Замените YOUR_DB на имя вашей базы данных. Вы должны предоставить свой пароль дважды, так что у вас есть шанс снова подумать ... ;-)
Почему вы не смогли просто экспортировать структуру базы данных, удалить базу данных, а затем воссоздать ее и импортировать структуру?
Самый надежный способ очистить все таблицы в базе данных был представлен kostanos в How to remove all MySQL tables from the command-line without DROP database permissions?
Поскольку код ниже очищает все таблицы в текущей базе данных вы можете выбрать другую базу данных, прежде чем продолжить.
USE DATABASE_YOU_WANT_TO_CLEAR;
Следующий фрагмент удалит данные из таблиц даже в присутствии ограничений внешнего ключа. Вы также можете дважды проверить список таблиц перед фактической очисткой, на случай если вы забыли выбрать нужную базу данных.
-- save current foreign key settings and disable foreign key checks
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET GROUP_CONCAT_MAX_LEN=32768; -- you never know how people name their tables
SET @tables = NULL;
SELECT GROUP_CONCAT('`', table_name, '`') INTO @tables
FROM information_schema.tables
WHERE table_schema = (SELECT DATABASE()); -- operates on the current DB
SELECT IFNULL(@tables,'dummy') INTO @tables; -- avoid error if there are no tables
-- At this point you might want to double check the list of tables
-- to be cleared. Run SELECT @tables; to do so.
SET @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET [email protected]_FOREIGN_KEY_CHECKS;
Это прекрасный ответ. Должен быть принят. –
Хотя команда TRUNCATE работает только для одной таблицы за раз. Ссылка http://stackoverflow.com/questions/15926826/truncate-multi-tables –
Мне пришлось восстановить резервную копию, в которой отсутствовали инструкции create. Поэтому я восстановил старую резервную копию, но мне пришлось избавиться от данных. Этот oneliner помог мне урезать все.
mysql -u user -ppass -NBe "SELECT 'SET foreign_key_checks = 0;' UNION SELECT CONCAT('TRUNCATE TABLE myschema.', table_name, ';') FROM INFORMATION_SCHEMA.tables WHERE table_schema = 'myschema' AND table_type = 'BASE TABLE'" | mysql -u user -ppass
Для лучшей читаемости снова разрывы строк:
mysql -u user -ppass -NBe "SELECT 'SET foreign_key_checks = 0;'
UNION SELECT CONCAT('TRUNCATE TABLE myschema.', table_name, ';')
FROM INFORMATION_SCHEMA.tables
WHERE table_schema = 'myschema' AND table_type = 'BASE TABLE'"
| mysql -u user -ppass
быть обязательно использовать строку без разрывов строк и заменить myschema
с схемой таблицы и установить правильные учетные данные или хост для процесса MySQL.
Я сохраню некоторые догадки, вы должны заменить каждый из учетных данных 'user',' password' и db name 'myschema' дважды. – aitchnyu
Используйте MySQL Workbench, чтобы получить схему привязки сущности вашей базы данных (в Workbench: Database -> Reverse Engineer). Затем отбросьте базу данных. Затем создайте базу данных с помощью Workbench (Database -> Forward Engineer).
В командной строке ...
USE dbname
SET foreign_key_checks = 0;
TRUNCATE tablename; //do this for each table you want emptied
SET foreign_key_checks = 1;
, конечно, не окончательное решение, но phpMyAdmin позволяет сделать это менее чем за 5 секунд ... Вы можете выбрать все таблицы и просто применить усечение для всех из них. –