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

Удаление данных из всех таблиц в MYSQL

У меня есть 100 таблиц, 40 000 строк в каждой таблице. Я хочу перейти в MySQL и удалить строки all из таблиц all.

... в 1-м выражении, если возможно?

Я хочу сохранить базу данных и таблицы.

4b9b3361

Ответ 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.

Ответ 2

Самый простой способ обрезать все таблицы при сохранении схемы.

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 в дампе.

Ответ 3

Самый надежный способ очистки всех таблиц в базе данных был представлен 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;

Ответ 4

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

truncate table <tablename>

Чтобы получить список сокращаемых таблиц, вы можете сделать что-то вроде:

SELECT table_name 
FROM INFORMATION_SCHEMA.tables 
WHERE table_schema = 'db_name' 

Ответ 5

Экспорт SQL script, удаление базы данных, воссоздание базы данных с помощью script.:)

Ответ 6

$ 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 восстановить всю информацию таблицы.

Ответ 7

В командной строке...

USE dbname

SET foreign_key_checks = 0;
TRUNCATE tablename;  //do this for each table you want emptied
SET foreign_key_checks = 1;

Ответ 8

Мне пришлось восстановить резервную копию, в которой отсутствовали инструкции 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.

Ответ 9

Возможно, но у вас есть побочные эффекты, которые вам могут не понравиться:

drop database <dbname>;

Это означает, что структуры таблиц удалены, а также индексы, хранимые процедуры и т.д. и т.д.

Единственный другой способ - написать хранимую процедуру, которая каким-то образом петлиет с помощью

truncate table <tablename>;

Ответ 10

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 ;

Ответ 11

Этот работает для меня в 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 на имя вашей базы данных. Вы должны предоставить свой пароль дважды, так что у вас есть шанс снова подумать...; -)

Ответ 12

Почему вы не могли просто экспортировать структуру базы данных, удалить базу данных, затем воссоздать ее и импортировать структуру?

Ответ 13

Начните с доступа к phpMyAdmin через cPanel или Plesk.

  1. Выберите базу данных, с которой вы хотите работать (из списка баз данных в левом столбце на домашней странице phpMyAdmin).
  2. Список таблиц появится в левом столбце и в более широком правом столбце.
  3. Проверьте таблицы, которые вы хотите обрезать (удалить только данные).
  4. В выпадающем списке, в котором изначально написано "С выбранным", выберите "Пустой" из этого списка.
  5. Он спросит вас, действительно ли вы хотите обрезать таблицу (ы). Убедитесь, что вы выбрали таблицы, которые вы действительно хотите обрезать.
  6. Нажмите Да, чтобы усечь (удалить данные) из таблицы.

Ответ 14

Эта две строки Script являются лучшими... попробуйте

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'DELETE FROM ?'
GO

Ответ 15

Используйте MySQL Workbench, чтобы получить диаграмму отношений Entity вашей базы данных (в Workbench: Database → Reverse Engineer). Затем отбросьте базу данных. Затем создайте базу данных с помощью Workbench (Database → Forward Engineer).

Ответ 16

Просто догадайтесь... попробуйте

ТАБЛИЧКА TRUNCATE *;

или

ТАБЛИЦА TRUNCATE table1, table2, table3;

или

DELETE FROM table1, table2, table3 WHERE 1 = 1;