Обрезать все таблицы в базе данных MySQL одной командой?

347

Существует ли запрос (команда) для усечения всех таблиц в базе данных за одну операцию? Я хочу знать, смогу ли я сделать это с помощью одного запроса.

devang
источник
1
Обрезать все таблицы? Вы имели в виду обрезать все столбцы всех таблиц в базе данных? На каком языке запросов это? (например, SQL, MySQL, Oracle, Postgres и т. д.)
Jay
Я не уверен, что я бы порекомендовал сделать это, так как вы могли бы легко попасть в неприятности. Есть ли причина, по которой вы не можете просто написать сценарий для усеченных и запустить сценарий?
GrayWizardx
спасибо 4 за ответ, но единственная причина, по которой не пишется сценарий: не хватает времени, поэтому подумал о выполнении запроса в mysql
devang
да, это в mysql..и запрос означает что-то похожее на усечение таблицы имя_таблицы..где я хочу обрезать все строки всех таблиц в моей БД в одном запросе
devang 16.12.09
Вы можете использовать Information_Schema с курсором. Не уверен насчет MySql, но он должен поддерживать Information_Schema.Tables
GrayWizardx

Ответы:

340

Отбросить (т.е. удалить таблицы)

mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "drop table $table" DATABASE_NAME; done

Усекать (т.е. пустые таблицы)

mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "truncate table $table" DATABASE_NAME; done
battousaix
источник
17
Да, чисто, ты. Но вам может понадобиться запустить это с -uUSER -pPASSWORD. Также вам может понадобиться запустить его несколько раз, если у вас есть FK без удаления на каскаде.
mihaicc
47
Если вы столкнулись с проблемами FK, такими как « Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполнено », обязательно отключите проверку внешнего ключа, изменив команду следующим образом:mysql -e "SET FOREIGN_KEY_CHECKS = 0; drop table $table" DATABASE_NAME
Ethan P.
24
Не нужно зацикливать клиента mysql. Вытащите это из цикла вот так:mysql -Nse 'show tables' DATABASE_NAME | while read table; do echo "drop table $table;"; done | mysql DATABASE_NAME
Александр Щебликин
2
@TylerCollier вам нужен .my.cnf
Феликс Ив
2
На основании приведенного выше ответа и комментариев, а также потому, что они не сработали, как я ожидал, я создал простой сценарий bash, который вы можете использовать для этого. Вы можете найти его по адресу: gist.github.com/mocanuga/eff26a3dcc40ef657a1c812f68511f6d
mocanuga
145

усекать несколько таблиц базы данных на экземпляре Mysql

SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
FROM INFORMATION_SCHEMA.TABLES where  table_schema in ('db1_name','db2_name');

Используйте Query Result для усечения таблиц

Примечание: возможно, вы получите эту ошибку:

ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

Это происходит, если есть таблицы с ссылками на внешние ключи к таблице, которую вы пытаетесь удалить / усечь.

Перед усечением таблиц все, что вам нужно сделать, это:

SET FOREIGN_KEY_CHECKS=0;

Обрежьте свои таблицы и измените их обратно на

SET FOREIGN_KEY_CHECKS=1;
Лалит Чоудхари
источник
1
Это, вероятно, лучшее решение, если у вас есть пользователь и пароль для вашей базы данных, и вы не хотите вводить их явно в вашей оболочке.
Бах
5
Проголосовал, потому что это решение требует только доступа к БД, а не доступа по SSH. Кроме того, он не зависит от ОС.
мастази
@mastazi У меня есть несколько вопросов: 1. что означает "table_schema"? это стоит от имени схемы? 2. что означает TABLE_NAME? это стоит для таблиц, которые должны быть удалены? 3. Должен ли я написать высокие таблицы, которые должны быть удалены с помощью команды вроде "('db1_name', 'db2_name')"?
AAEM
@ Ахмед, единственные необходимые замены - вы должны заменить db1_name и db2_name именами ваших баз данных. Затем вы должны скопировать результаты этого запроса, вставить их как новый запрос MySQL и выполнить их. INFORMATION_SCHEMA - это встроенная схема, которая предустанавливается в каждой установке MySQL и содержит информацию о ваших базах данных, не трогайте ее, иначе ваш MySQL начнет плохо себя вести :-) table_schema и table_name являются столбцами таблицы, называемой "TABLES" в информационная
схема
под "db_name" вы подразумеваете название схемы? у меня есть только 1 схема, которую я хочу удалить из данных таблиц
AAEM
67

Используйте phpMyAdmin следующим образом:

Просмотр базы данных => Отметить все (таблицы) => Пусто

Если вы хотите игнорировать проверки внешнего ключа, вы можете снять флажок с надписью:

[] Включить проверку внешнего ключа

Вам нужно будет запустить как минимум версию 4.5.0 или выше, чтобы установить этот флажок.

Это не MySQL CLI-fu, но эй, это работает!

Nemo
источник
31
кто сказал, что у нас работает PHP ...?
2011 года
37
Кто сказал, что мы не сделали? Этот ответ, очевидно, оказывается полезным для людей; помогает.
bzeaman
2
Это не будет работать, если у вас есть схема базы данных родитель-потомок.
Кэри Бондок
2
Сбой ограничения внешнего ключа.
Брайан
2
@BrianHannay Он был добавлен в PMA 4.5.0 в июне 2015 года. Я нашел
Nemo
24

MS SQL Server 2005+ (Удалить PRINT для фактического выполнения ...)

EXEC sp_MSforeachtable 'PRINT ''TRUNCATE TABLE ?'''

Если ваша платформа базы данных поддерживает представления INFORMATION_SCHEMA, возьмите результаты следующего запроса и выполните их.

SELECT 'TRUNCATE TABLE ' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

Попробуйте это для MySQL:

SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES

Добавление точки с запятой в Concat упрощает использование, например, из среды MySQL.

SELECT Concat('TRUNCATE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES
пляж
источник
привет .. спасибо за ответ d, я попробовал этот запрос, но, похоже, не работает .. это что-то вроде усеченной таблицы table_name, которую я могу использовать для всех таблиц в моей
базе данных
Я забыл, что MySQL не поддерживает оператор "+" напрямую. Предполагая, что это ошибка, я добавил пример CONCAT () выше. Если вы все еще получаете сообщение об ошибке, пожалуйста, поделитесь фактическим сообщением об ошибке.
пляж
этот запрос работает, но что, если у меня есть имя базы данных diff, например, devang..то мое имя базы данных, поэтому, если я использую его в соответствии с вашим запросом, выдает ошибку foll .. Таблица 'devang.TABLES' не существует
devang
3
Ааа. INFORMATION_SCHEMA - это представление, которое существует в активной базе данных. Если вы измените базу данных, представление будет выполнено для этой базы данных. Нет необходимости изменять запрос при смене баз данных. Просто выполните следующие действия: 1) изменить активную базу данных. 2) запустить скрипт. 3) скопировать результаты 4) вставить результаты обратно в редактор 5) выполнить результаты. Все таблицы в активной базе данных теперь усечены.
пляж
1
BEWARE! Это выбирает все таблицы во всех базах данных (даже те, которых нет в текущей базе данных. Пример MySQL не работает, но в моем случае он возвратил 293 строки (таблицы) вместо 66). Представьте себе потерю данных ...
f4der
19

Я нашел это, чтобы удалить все таблицы в базе данных:

mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | mysql -uUSERNAME -pPASSWORD DATABASENAME

Полезно, если вы ограничены хостингом (не можете удалить всю базу данных).

Я изменил его, чтобы обрезать таблицы. Для mysqldump нет таблицы «--add-truncate-table», поэтому я сделал:

mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | sed -e 's/DROP TABLE IF EXISTS/TRUNCATE TABLE/g' | mysql -uUSERNAME -pPASSWORD DATABASENAME

у меня работает --edit, исправление опечатки в последней команде

mbjungle
источник
15
SET FOREIGN_KEY_CHECKS = 0;

SELECT @str := CONCAT('TRUNCATE TABLE ', table_schema, '.', table_name, ';')
FROM   information_schema.tables
WHERE  table_type   = 'BASE TABLE'
  AND  table_schema IN ('db1_name','db2_name');

PREPARE stmt FROM @str;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

SET FOREIGN_KEY_CHECKS = 1;
Джордж Мойк
источник
Если вы хотите работать с текущей базой данных (и, таким образом, сделать этот код переносимым), измените последнее условие SELECTна следующее:AND table_schema = DATABASE();
alx
Это не урезать для меня. MySQL 5.7.25
Лукас Бустаманте
14

Я обнаружил, что проще всего сделать что-то вроде приведенного ниже кода, просто заменить имена таблиц своими собственными. важно убедиться, что последняя строка всегда SET FOREIGN_KEY_CHECKS = 1;

SET FOREIGN_KEY_CHECKS=0;
TRUNCATE `table1`;
TRUNCATE `table2`;
TRUNCATE `table3`;
TRUNCATE `table4`;
TRUNCATE `table5`;
TRUNCATE `table6`;
TRUNCATE `table7`;
SET FOREIGN_KEY_CHECKS=1;
user3357946
источник
7
вам не нужно повторять SET FOREIGN_KEY_CHECKS = 0; после каждой команды TRUNCATE только в стартовой строке, которая будет помечать режим как 0
HMagdy
12

Это напечатает команду для усечения всех таблиц:

SELECT GROUP_CONCAT(Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME) SEPARATOR ';') FROM INFORMATION_SCHEMA.TABLES where table_schema in ('my_db');
Гаурав Гупта
источник
5
  1. Чтобы усечь таблицу, необходимо удалить ограничения внешнего ключа, сопоставленные столбцам в этой таблице, из других таблиц (фактически для всех таблиц в конкретной БД / Схеме).
  2. Таким образом, все ограничения по внешнему ключу должны быть первоначально удалены, после чего следует усечение таблицы.
  3. Дополнительно, используйте таблицу оптимизации (в mysql, innodb engine esp), чтобы вернуть используемое пространство / размер данных в ОС после усечения данных.
  4. После усечения данных снова создайте те же ограничения внешнего ключа в той же таблице. Ниже приведен скрипт, который будет генерировать скрипт для выполнения вышеуказанных операций.

    SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME,';') FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_TYPE='FOREIGN KEY' AND TABLE_SCHEMA='<TABLE SCHEMA>'
    UNION
    SELECT CONCAT('TRUNCATE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA='<TABLE SCHEMA>' AND TABLE_TYPE='BASE TABLE'
    UNION
    SELECT CONCAT('OPTIMIZE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA='<TABLE SCHEMA>' AND TABLE_TYPE='BASE TABLE'
    UNION
    SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' ADD CONSTRAINT ',CONSTRAINT_NAME,' FOREIGN KEY(',COLUMN_NAME,')',' REFERENCES ',REFERENCED_TABLE_NAME,'(',REFERENCED_COLUMN_NAME,');') FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE CONSTRAINT_NAME LIKE 'FK%' AND TABLE_SCHEMA='<TABLE SCHEMA>'
    INTO OUTFILE "C:/DB Truncate.sql" LINES TERMINATED BY '\n';

Теперь запустите сгенерированный скрипт Db Truncate.sql

Преимущества. 1) Восстановить дисковое пространство 2) Нет необходимости отбрасывать и воссоздавать БД / Схему с той же структурой

Недостатки. 1) Ограничения FK должны быть именами в таблице с именем, содержащим «FK» в имени ограничения.

Ананд
источник
3

При использовании SQL Server 2005 существует скрытая хранимая процедура, которая позволяет вам выполнить команду или набор команд для всех таблиц в базе данных. Вот как бы вы вызывали TRUNCATE TABLEэту хранимую процедуру:

EXEC [sp_MSforeachtable] @command1="TRUNCATE TABLE ?"

Вот хорошая статья, которая развивается дальше.

Для MySql, однако, вы могли бы использовать туздЫшпр и указать --add-drop-tablesи --no-dataопцию для падения и создать все таблицы , игнорируя данные. как это:

mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE]

Руководство по использованию mysqldump от dev.mysql

Dostee
источник
3

Используйте это и сформируйте запрос

SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
FROM INFORMATION_SCHEMA.TABLES where  table_schema in (db1,db2)
INTO OUTFILE '/path/to/file.sql';

Теперь используйте это, чтобы использовать этот запрос

mysql -u username -p </path/to/file.sql

если вы получите ошибку, как это

ERROR 1701 (42000) at line 3: Cannot truncate a table referenced in a foreign key constraint

самый простой способ пройти через это вверху файла добавить эту строку

SET FOREIGN_KEY_CHECKS=0;

который говорит, что мы не хотим проверять ограничения внешнего ключа при прохождении этого файла.

Он обрезает все таблицы в базах данных db1 и bd2.

Винод Кумар
источник
имена БД должны быть в qoutes
Роман М
2

Вот мой вариант иметь «один оператор для усечения их всех».

Во-первых, я использую отдельную базу данных с именем «util» для своих вспомогательных хранимых процедур. Код моей хранимой процедуры для усечения всех таблиц:

DROP PROCEDURE IF EXISTS trunctables;
DELIMITER ;;
CREATE  PROCEDURE trunctables(theDb varchar(64))
BEGIN
    declare tname varchar(64);
    declare tcursor CURSOR FOR 
    SELECT table_name FROM information_schema.tables WHERE table_type <> 'VIEW' AND table_schema = theDb;
    SET FOREIGN_KEY_CHECKS = 0; 
    OPEN tcursor;
    l1: LOOP
        FETCH tcursor INTO tname;
        if tname = NULL then leave l1; end if;
        set @sql = CONCAT('truncate `', theDB, '`.`', tname, '`');
        PREPARE stmt from @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END LOOP l1;
    CLOSE tcursor;
    SET FOREIGN_KEY_CHECKS = 1; 
END ;;
DELIMITER ;

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

call util.trunctables('nameofdatabase');

что сейчас ровно одно утверждение :-)

bebbo
источник
2

здесь я знаю здесь

   SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
    FROM INFORMATION_SCHEMA.TABLES where  table_schema in ('databasename1','databasename2');

Если не удается удалить или обновить родительскую строку: ограничение внешнего ключа не выполняется

Это происходит, если есть таблицы с ссылками на внешние ключи к таблице, которую вы пытаетесь удалить / усечь.

Перед усечением таблиц все, что вам нужно сделать, это:

SET FOREIGN_KEY_CHECKS=0;

Обрежьте свои таблицы и измените их обратно на

SET FOREIGN_KEY_CHECKS=1; 

используйте этот php код

    $truncate = mysql_query("SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') as tables_query FROM INFORMATION_SCHEMA.TABLES where table_schema in ('databasename')");

    while($truncateRow=mysql_fetch_assoc($truncate)){

        mysql_query($truncateRow['tables_query']);

    }
?>

проверить подробности здесь ссылка

Джидипсин Пармар
источник
1

Вот процедура, которая должна обрезать все таблицы в локальной базе данных.

Дайте мне знать, если это не сработает, и я удалю этот ответ.

Непроверенные

CREATE PROCEDURE truncate_all_tables()
BEGIN

   -- Declare local variables
   DECLARE done BOOLEAN DEFAULT 0;
   DECLARE cmd VARCHAR(2000);

   -- Declare the cursor
   DECLARE cmds CURSOR
   FOR
   SELECT CONCAT('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES;

   -- Declare continue handler
   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;

   -- Open the cursor
   OPEN cmds;

   -- Loop through all rows
   REPEAT

      -- Get order number
      FETCH cmds INTO cmd;

      -- Execute the command
      PREPARE stmt FROM cmd;
      EXECUTE stmt;
      DROP PREPARE stmt;

   -- End of loop
   UNTIL done END REPEAT;

   -- Close the cursor
   CLOSE cmds;

END;
пляж
источник
Мне потребовалось много времени, чтобы выяснить, почему это не сработало. Тогда помог комментарий к этой ветке электронной почты: forums.mysql.com/read.php?61,116597,219343#msg-219343 - Для справки. : «К сожалению, похоже, что операторы prepare не могут использоваться в курсорах. Из руководства: dev.mysql.com/doc/refman/6.0/en/… »
Tominator
1

Я обнаружил, что TRUNCATE TABLE .. имеет проблемы с ограничениями внешнего ключа, даже после NOCHECK CONSTRAINT ALL, поэтому вместо этого я использую инструкцию DELETE FROM. Это означает, что семена идентичности не сбрасываются, для этого всегда можно добавить DBCC CHECKIDENT.

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

EXEC sp_MSforeachtable 'PRINT ''ALTER TABLE ? NOCHECK CONSTRAINT ALL'''
EXEC sp_MSforeachtable 'print ''DELETE FROM ?'''
EXEC sp_MSforeachtable 'print ''ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'''
cedd
источник
0

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

ГДж.
источник
1
mysqldump -uuser -ppassword --no-data salesLeadsBrittany> salesLeadsTemplate.sql Это создаст файл sql только со схемой (без данных). Вы можете удалить базу данных после этой команды и восстановить базу данных, импортировав схему.
ГДж.
0

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

  1. Выберите (все) таблицы, которые нужно удалить (Отметить все)
  2. Выберите «Удалить» / «Обрезать» из списка «С выбранным:»
  3. На странице подтверждения («Вы действительно хотите:») скопируйте запрос (все с красным фоном)
  4. Перейдите вверх и нажмите на SQL и напишите: «SET FOREIGN_KEY_CHECKS = 0;» затем вставьте ранее скопированный запрос
  5. Нажмите «Перейти»

Идея состоит в том, чтобы быстро получить все таблицы из базы данных (что вы делаете за 5 секунд и 2 клика), но сначала отключить проверку внешнего ключа. Нет CLI и нет удаления базы данных и добавления ее снова.

Павел Мокан
источник
0
TB=$( mysql -Bse "show tables from DATABASE" );
for i in ${TB};
    do echo "Truncating table ${i}";
    mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table DATABASE.${i}; set foreign_key_checks=1; set unique_checks=1";
    sleep 1;
done

-

Дэвид,

Спасибо, что нашли время для форматирования кода, но это то, как он должен применяться.

-Kurt

На коробке UNIX или Linux:

Убедитесь, что вы находитесь в оболочке bash. Эти команды должны быть запущены из командной строки следующим образом.

Примечание:

Я храню свои учетные данные в моем файле ~ / .my.cnf, поэтому мне не нужно указывать их в командной строке.

Примечание:

cpm - это имя базы данных

Я показываю только небольшую выборку результатов из каждой команды.

Найдите ограничения внешнего ключа:

klarsen@Chaos:~$ mysql -Bse "select concat(table_name, ' depends on ', referenced_table_name)
             from information_schema.referential_constraints
             where constraint_schema = 'cpm'
             order by referenced_table_name"
  1. утверждение_экстернальной_системы зависит от утверждения_просмотра
  2. адрес зависит от клиента
  3. идентификатор клиента зависит от клиента
  4. external_id зависит от клиента
  5. учетные данные зависят от клиента
  6. адрес электронной почты зависит от клиента
  7. утверждение - запрос зависит от клиента
  8. customer_status зависит от клиента
  9. customer_image зависит от клиента

Перечислите таблицы и количество строк:

klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n

 1  address 297
 2  approval_external_system    0
 3  approval_request    0
 4  country 189
 5  credential  468
 6  customer    6776
 7  customer_identification 5631
 8  customer_image  2
 9  customer_status 13639

Обрежьте свои таблицы:

klarsen@Chaos:~$ TB=$( mysql -Bse "show tables from cpm" ); for i in ${TB}; do echo "Truncating table ${i}"; mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table cpm.${i}; set foreign_key_checks=1; set unique_checks=1"; sleep 1; done
  1. Адрес усеченной таблицы
  2. Усеченная таблицаopy_external_system
  3. Усеченный стол Approval_request
  4. Усеченный стол страна
  5. Учетные данные усеченной таблицы
  6. Усеченный стол заказчика
  7. Усеченный стол customer_identification
  8. Усеченный стол customer_image
  9. Усеченный стол customer_status

Убедитесь, что это сработало:

klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n

 1  address 0
 2  approval_external_system    0
 3  approval_request    0
 4  country 0
 5  credential  0
 6  customer    0
 7  customer_identification 0
 8  customer_image  0
 9  customer_status 0
10  email_address   0

На коробке Windows:

НОТА:

cpm - это имя базы данных

C:\>for /F "tokens=*" %a IN ('mysql -Bse "show tables" cpm') do mysql -e "set foreign_key_checks=0; set unique_checks=0; truncate table %a; foreign_key_checks=1; set unique_checks=1" cpm
Курт Ларсен
источник
0

Следующий запрос MySQL сам создаст один запрос, который будет обрезать все таблицы в данной базе данных. Он обходит иностранные ключи:

SELECT CONCAT(
         'SET FOREIGN_KEY_CHECKS=0; ',
         GROUP_CONCAT(dropTableSql SEPARATOR '; '), '; ',
         'SET FOREIGN_KEY_CHECKS=1;'
       ) as dropAllTablesSql
FROM   ( SELECT  Concat('TRUNCATE TABLE ', table_schema, '.', TABLE_NAME) AS dropTableSql
         FROM    INFORMATION_SCHEMA.TABLES
         WHERE   table_schema = 'DATABASE_NAME' ) as queries
Роэль ван Дуйнховен
источник
0
mysqldump -u root -p --no-data dbname > schema.sql
mysqldump -u root -p drop dbname
mysqldump -u root -p < schema.sql
Emanuele
источник
0

Солн 1)

mysql> select group_concat('truncate',' ',table_name,';') from information_schema.tables where table_schema="db_name" into outfile '/tmp/a.txt';
mysql> /tmp/a.txt;

Soln 2)

- Export only structure of a db
- drop the database
- import the .sql of structure 

-- редактировать ----

earlier in solution 1, i had mentioned concat() instead of group_concat() which would have not returned the desired result
Красавица надар
источник
1
Это только возвращает первую таблицу: TRUNCATE table1 и забывает обо всех остальных таблицах.
Стивен Смит
Это решение было бы определенно безумным. я не знаю, почему он не получил голос. может быть из-за моей ошибки, которая была отредактирована.
красавица Надар
0

Это сработало для меня. Измените базу данных, имя пользователя и пароль соответственно.

mysql -Nse 'show tables' -D DATABASE -uUSER -pPWD | while read table; do echo "SET FOREIGN_KEY_CHECKS = 0;drop table \`$table\`;SET FOREIGN_KEY_CHECKS = 1;"; done | mysql DATABASE -uUSER -pPWD

Акиф
источник
-1

Идея может быть просто удалить и воссоздать таблицы?

РЕДАКТИРОВАТЬ:

@ Джонатан Леффлер: Правда

Другое предложение (или если вам не нужно обрезать ВСЕ таблицы):

Почему бы просто не создать базовую хранимую процедуру для усечения определенных таблиц

CREATE PROCEDURE [dbo].[proc_TruncateTables]
AS
TRUNCATE TABLE Table1
TRUNCATE TABLE Table2
TRUNCATE TABLE Table3
GO
Марк Редман
источник
Это приводит к потере всех ограничений, разрешений, представлений и т. Д. Для таблиц, что создает значительные неудобства.
Джонатан Леффлер
Вы можете сделать удаление, а затем заново заполнить все таблицы вместо усечения. Я предполагаю, что оценка вниз из-за разочарования. Просто восстановите свою резервную копию.
Марк Редман
-5
<?php
// connect to database
$conn=mysqli_connect("localhost","user","password","database");

// check connection
if (mysqli_connect_errno()) {
  exit('Connect failed: '. mysqli_connect_error());
}

// sql query
$sql =mysqli_query($conn,"TRUNCATE " . TABLE_NAME);


// Print message
if ($sql === TRUE) {
  echo 'data delete successfully';
}
else {
 echo 'Error: '. $conn->error;
}

$conn->close();

?>

Вот фрагмент кода, который я использую для очистки таблицы. Просто измените $ conn info и TABLE_NAME.

Джеймс Левей
источник
Эй, Джеймс, я думаю, что OP ищет, во-первых, одну строку… и, во-вторых, команду, чтобы получить все таблицы один раз и удалить их. это требует какого-то вмешательства пользователя. спасибо за пост, хотя
Крейг Уэйн