2009-12-11 3 views

ответ

10

Я так не думаю (но раньше я был неправ). То, что я обычно делаю, - это два этапа.

Если СУБД имеет интерфейс командной строки, вы можете использовать его, чтобы создать сценарий, чтобы сделать большую часть работы, что-то вроде:

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.

+0

, конечно, не окончательное решение, но phpMyAdmin позволяет сделать это менее чем за 5 секунд ... Вы можете выбрать все таблицы и просто применить усечение для всех из них. –

1

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

drop database <dbname>; 

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

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

truncate table <tablename>; 
+1

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

-3

только предположение ... попробовать это

TRUNCATE TABLE *;

Или

TRUNCATE TABLE table1, table2, Таблица3;

Или

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

+0

Я никогда не видел, что рекламировал и реализовал в любом месте. Это работает? – wallyk

+0

Не знаю, но было бы хорошо, если бы это было! –

+1

«ГДЕ 1 = 1» является чрезмерным и, следовательно, вообще не требуется. – mctom987

6

Это потребует хранимую процедуру или сценарий, который перебирает каждую таблицу и делает:

truncate table <tablename>

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

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

+1: вы бы хотели использовать подготовленное заявление, чтобы выполнять итерацию по таблицам: http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html –

27

Самый простой способ усечения всех таблиц при сохранении схемы.

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

+14

это работает, но осторожность !!!! он устраняет все ограничения внешнего ключа. – mickeymoon

4

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

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

-1

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

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

Это не сработает для MySQL. – Lunc

1
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 ; 
+0

и obvioulsy после создания этой процедуры вы будете писать call cleanAllTables; – Machoo

1

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

0

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

4

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

Это прекрасный ответ. Должен быть принят. –

+0

Хотя команда TRUNCATE работает только для одной таблицы за раз. Ссылка http://stackoverflow.com/questions/15926826/truncate-multi-tables –

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.

+0

Я сохраню некоторые догадки, вы должны заменить каждый из учетных данных 'user',' password' и db name 'myschema' дважды. – aitchnyu

-1

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

0

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

USE dbname 

SET foreign_key_checks = 0; 
TRUNCATE tablename; //do this for each table you want emptied 
SET foreign_key_checks = 1; 
Смежные вопросы