Обрізати всі таблиці в базі даних MySQL однією командою?


347

Чи є запит (команда) для врізання всіх таблиць у базі даних за одну операцію? Я хочу знати, чи можу я це зробити за допомогою одного запиту.


1
Обрізати всі таблиці? ви мали на увазі усікати всі стовпці всіх таблиць у базі даних? Яка мова запитів це? (наприклад, SQL, MySQL, Oracle, Postgres тощо)
Jay

Я не впевнений, я б рекомендував робити це, оскільки ви могли дуже легко потрапити в біду. Чи є причина, чому ви не можете просто скриптувати усі скорочення і запускати сценарій?
GrayWizardx

спасибі 4 відповідь, але єдина причина, що не писати сценарії, не вистачає часу, тому думка про запуску запиту в mysql
devang

ya його в mysql..і запит означає щось подібне до урізання таблиці table_name..ту я хочу обрізати всі рядки всіх таблиць у моєму db за один запит
devang

Ви можете використовувати Information_Schema з курсором. Не впевнений у MySql, але він повинен підтримувати Information_Schema.Tables
GrayWizardx

Відповіді:


340

Drop (тобто видалити таблиці)

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

17
Так, чисто, ти. Але вам може знадобитися запустити це за допомогою -uUSER -pPASSWORD. Також вам, можливо, доведеться запускати його кілька разів, якщо у вас є FK без видалення на каскаді.
mihaicc

47
Якщо у вас виникли проблеми з FK, такі як " Неможливо видалити або оновити батьківський рядок: помилка зовнішнього ключа не вдається ", не забудьте відключити перевірку зовнішнього ключа, змінивши команду наступним чином:mysql -e "SET FOREIGN_KEY_CHECKS = 0; drop table $table" DATABASE_NAME
Етан П.

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');

Використовуйте результат запиту для обрізання таблиць

Примітка: можливо, ви отримаєте цю помилку:

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')"?
ААЕМ

@Ahmed єдиними необхідними підмінами є те, що вам потрібно замінити db1_name та db2_name на імена ваших баз даних. Тоді вам доведеться скопіювати результати цього запиту та вставити їх як новий запит mysql та виконати їх. INFORMATION_SCHEMA - це вбудована схема, яка попередньо встановлена ​​у кожній установці MySQL і містить інформацію про ваші бази даних, не торкайтеся її, або ваш MySQL почне неправильно поводитись :-) table_schema та table_name - це стовпці таблиці під назвою "TABLES" information_schema
mastazi

під "db_name" ви маєте на увазі ім'я схеми? У мене є лише 1 схема, за якою я хочу видалити дані своїх таблиць
AAEM

67

Використовуйте phpMyAdmin таким чином:

Перегляд бази даних => Перевірити всі (таблиці) => Порожні

Якщо ви хочете ігнорувати чеки іноземних ключів, ви можете зняти прапорець із написом:

[] Увімкніть перевірку зовнішніх ключів

Вам потрібно буде запустити принаймні версію 4.5.0 або вище, щоб отримати цей прапорець.

Це не MySQL CLI-fu, але ей, це працює!


31
хто сказав, що ми запускаємо PHP ...?
jsh

37
Хто сказав, що ми цього не зробили? Ця відповідь, очевидно, виявляється корисною для людей; це допомагає.
bzeaman

2
Це не спрацює, якщо у вас є схема бази даних батько-дитина.
Кері Бондок

2
Збої в зовнішньому ключі не вдається.
Брайан Ханней

2
@BrianHannay Додано в PMA 4.5.0 у червні 2015 року. Я знайшов журнал змін та оригінальний випуск
Немо

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

Додавання крапки до крапки з комою полегшує використання, наприклад, зсередини робочої версії mysql.

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

привіт .. дякую за відповідь, я спробував цей запит, але, здається, не працює .. це щось на зразок обрізання таблиці table_name, яке я можу використовувати для всіх таблиць у моєму
дебілі

Я забув, що MySQL не підтримує оператора "+" безпосередньо. Припускаючи, що це помилка, я додав приклад CONCAT () вище. Якщо ви все ще отримуєте повідомлення про помилку, будь ласка, поділіться фактичним повідомленням про помилку.
пляж

цей запит працює, але що робити, якщо у мене є розрізнене ім'я db, наприклад, devang..це моє ім'я db, тож якщо я використовую його згідно з вашим вище запитом, видає помилку foll. Таблиця 'devang.TABLES' не існує
devang

3
А-а-а. INFORMATION_SCHEMA - це представлення, яке існує в активній базі даних. Якщо ви зміните свою базу даних, подання буде виконано проти цього БД. Не потрібно змінювати запит при зміні баз даних. Просто виконайте наступні дії: 1) змінити активну базу даних. 2) запустіть сценарій. 3) скопіювати результати 4) вставити результати назад в редактор 5) виконати результати. Усі таблиці в активній базі даних тепер усічені.
пляж

1
ПОДЕРЖАЙТЕ! Це вибирає всі таблиці у всіх базах даних (навіть ті, які НЕ є у поточній базі даних. Приклад MySQL не працює, але в моєму випадку він повернув 293 рядок (таблиці) замість 66. Уявіть втрату даних ...
f4der

19

Я виявив, що це видаляє всі таблиці в базі даних:

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

Корисно, якщо ви обмежені хостинговим рішенням (не можете скинути цілу базу даних).

Я змінив його для врізання таблиць. Не існує "--add-усікання таблиці" для mysqldump, тому я зробив:

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, фіксуючи помилку друку в останній команді


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;

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 сервер 2005, існує прихована збережена процедура, яка дозволяє виконувати команду або набір команд проти всіх таблиць всередині бази даних. Ось як би зателефонувати за TRUNCATE TABLEдопомогою цієї збереженої процедури:

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

Ось хороша стаття, яка детальніше розглядає.

Для MySql, однак, ви можете використовувати mysqldump та вказати --add-drop-tablesта --no-dataпараметри для скидання та створення всіх таблиць, ігноруючи дані. подобається це:

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

посібник з використання mysqldump від dev.mysql


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.


імена db повинні бути в qoutes
Roman M


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');

що зараз рівно одне твердження :-)


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 - Для довідки : "На жаль, схоже, що підготовчі заяви не можна використовувати в курсорах. З посібника: dev.mysql.com/doc/refman/6.0/en/… "
Томатор

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'''

0

Я не впевнений, але я думаю, що є одна команда, за допомогою якої ви можете скопіювати схему бази даних у нову базу даних, після цього ви можете видалити стару базу даних і після цього ви зможете знову скопіювати схему бази даних на старе ім'я.


1
mysqldump -uuser -ppassword --no-data salesLeadsBrittany> salesLeadsTemplate.sql Це створить файл sql лише зі схемою (відсутні дані). Ви можете видалити базу даних після цієї команди і можете відтворити базу даних, імпортувавши схему.
GJ.

0

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

  1. Виберіть (усі) таблиці для видалення (Позначити всі)
  2. Виберіть "Drop" / "усікання" зі списку "With selected:"
  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

-

Девід,

Дякуємо, що знайшли час для форматування коду, але саме так він повинен застосовуватися.

-Курт

У вікні UNIX або Linux:

Переконайтеся, що ви перебуваєте в оболонці. Ці команди слід виконати з командного рядка наступним чином.

Примітка:

Я зберігаю свої облікові дані у своєму файлі ~ / .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. Підтвердження_external_system залежить від затвердження_запит
  2. адреса залежить від замовника
  3. customer_identification залежить від замовника
  4. external_id залежить від замовника
  5. Повноважність залежить від замовника
  6. Адреса електронної пошти залежить від замовника
  7. затвердження_запит залежить від замовника
  8. customer_status залежить від замовника
  9. зображення_матеріал залежить від замовника

Перерахуйте таблиці та кількість рядків:

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. Загальна таблиця затвердження_external_system
  3. Затвердження_запит таблиці обрізання
  4. Країна обрізного столу
  5. Обрізання облікових даних таблиці
  6. Обрізний клієнт таблиці
  7. Таблиця обрізання клієнта_ідентифікація
  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

0

Soln 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
Це, здається, повертає першу таблицю: таблиця TRUNCATE1 та забуває про всі інші таблиці.
Стівен Сміт

Це рішення було б точно безумним. я не знаю, чому він не отримав голосування. може бути моєю помилкою, яку було відредаговано.
Анжелін Надар

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

Ідея може бути просто скинути та відтворити таблиці?

Редагувати:

@Jonathan Leffler: Правда

Інші пропозиції (або випадок, якщо вам не потрібно врізати ВСІ таблиці):

Чому б просто не створити основну збережену процедуру для обрізання конкретних таблиць

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 і TABLE_NAME.


Ей Джеймс, я думаю, що ОП шукає, по-перше, одного вкладиша .... а по-друге, команду отримати всі таблиці один раз і видалити їх. це вимагає певного втручання користувача. спасибі за допис, хоча
Крейг Уейн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.