У меня есть 100 таблиц, 40 000 строк в каждой таблице. Я хочу перейти в MySQL и удалить строки all из таблиц all.
... в 1-м выражении, если возможно?
Я хочу сохранить базу данных и таблицы.
У меня есть 100 таблиц, 40 000 строк в каждой таблице. Я хочу перейти в MySQL и удалить строки all из таблиц all.
... в 1-м выражении, если возможно?
Я хочу сохранить базу данных и таблицы.
Я так не думаю (но раньше я ошибался). То, что я обычно делаю, - это два этапа.
Если ваша СУБД имеет интерфейс командной строки, вы можете использовать ее для создания script, чтобы выполнить основную часть работы, например:
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
.
Самый простой способ обрезать все таблицы при сохранении схемы.
mysqldump -d -uuser -ppass --add-drop-table databasename > databasename.sql
mysql -uuser -ppass databasename < databasename.sql
Не уверен, что он сохранит хранимые процедуры, поскольку они не используются там, где я работаю, но я регулярно их использую в reset базах данных.
Переключатель -d
на mysqldump означает "не сбрасывать данные".
--add-drop-table
добавляет оператор DROP TABLE к каждому CREATE TABLE в дампе.
Самый надежный способ очистки всех таблиц в базе данных был представлен kostanos в Как удалить все MySQL таблицы из командной строки без разрешений базы данных DROP?
Так как приведенный ниже код очищает все таблицы в текущей базе данных, вы можете выбрать другую базу данных, прежде чем продолжить.
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;
Для этого потребуется хранимая процедура или script, которая проходит через каждую таблицу и выполняет следующие действия:
truncate table <tablename>
Чтобы получить список сокращаемых таблиц, вы можете сделать что-то вроде:
SELECT table_name
FROM INFORMATION_SCHEMA.tables
WHERE table_schema = 'db_name'
Экспорт SQL script, удаление базы данных, воссоздание базы данных с помощью script.:)
$ 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
сохраняет только информацию таблицы базы данных и игнорирует все данные таблицы; вам просто нужно reimport сгенерированный файл .sql
восстановить всю информацию таблицы.
В командной строке...
USE dbname
SET foreign_key_checks = 0;
TRUNCATE tablename; //do this for each table you want emptied
SET foreign_key_checks = 1;
Мне пришлось восстановить резервную копию, в которой отсутствовали инструкции 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.
Возможно, но у вас есть побочные эффекты, которые вам могут не понравиться:
drop database <dbname>;
Это означает, что структуры таблиц удалены, а также индексы, хранимые процедуры и т.д. и т.д.
Единственный другой способ - написать хранимую процедуру, которая каким-то образом петлиет с помощью
truncate table <tablename>;
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 ;
Этот работает для меня в 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 на имя вашей базы данных. Вы должны предоставить свой пароль дважды, так что у вас есть шанс снова подумать...; -)
Почему вы не могли просто экспортировать структуру базы данных, удалить базу данных, затем воссоздать ее и импортировать структуру?
Начните с доступа к phpMyAdmin через cPanel или Plesk.
Эта две строки Script являются лучшими... попробуйте
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'DELETE FROM ?'
GO
Используйте MySQL Workbench, чтобы получить диаграмму отношений Entity вашей базы данных (в Workbench: Database → Reverse Engineer). Затем отбросьте базу данных. Затем создайте базу данных с помощью Workbench (Database → Forward Engineer).
Просто догадайтесь... попробуйте
ТАБЛИЧКА TRUNCATE *;
или
ТАБЛИЦА TRUNCATE table1, table2, table3;
или
DELETE FROM table1, table2, table3 WHERE 1 = 1;