Обрезать все таблицы в базе данных MySQL одной командой? - PullRequest
316 голосов
/ 16 декабря 2009

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

Ответы [ 24 ]

3 голосов
/ 09 сентября 2013

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

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.

2 голосов
/ 19 июля 2016

здесь, потому что я знаю здесь

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

    }
?>

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

2 голосов
/ 29 июля 2011

Нет.Не существует единой команды для усечения всех таблиц mysql одновременно.Вам нужно будет создать небольшой скрипт для усечения таблиц по одной.

ref: http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html

1 голос
/ 01 ноября 2015

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

Во-первых, я использую отдельную базу данных с именем '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');

, что теперь точно одно утверждение: -)

1 голос
/ 16 декабря 2009

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

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

Не проверено

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;
1 голос
/ 27 апреля 2012

Я обнаружил, что 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 голосов
/ 27 марта 2013

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

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

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

0 голосов
/ 16 декабря 2009

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

EDIT:

@ Джонатан Леффлер: Верно

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

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

CREATE PROCEDURE [dbo].[proc_TruncateTables]
AS
TRUNCATE TABLE Table1
TRUNCATE TABLE Table2
TRUNCATE TABLE Table3
GO
0 голосов
/ 16 декабря 2009

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

0 голосов
/ 26 октября 2014
<?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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...