Обрезать все таблицы? Вы имели в виду обрезать все столбцы всех таблиц в базе данных? На каком языке запросов это? (например, 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 |whilereadtable; do mysql -e "drop table $table" DATABASE_NAME; done
Усекать (т.е. пустые таблицы)
mysql -Nse 'show tables' DATABASE_NAME |whilereadtable; do mysql -e "truncate table $table" DATABASE_NAME; done
Да, чисто, ты. Но вам может понадобиться запустить это с -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
На основании приведенного выше ответа и комментариев, а также потому, что они не сработали, как я ожидал, я создал простой сценарий 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 deleteorupdate a parent row: a foreignkeyconstraint fails
Это происходит, если есть таблицы с ссылками на внешние ключи к таблице, которую вы пытаетесь удалить / усечь.
Перед усечением таблиц все, что вам нужно сделать, это:
Это, вероятно, лучшее решение, если у вас есть пользователь и пароль для вашей базы данных, и вы не хотите вводить их явно в вашей оболочке.
Бах
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 или выше, чтобы установить этот флажок.
привет .. спасибо за ответ 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
Я нашел это, чтобы удалить все таблицы в базе данных:
Если вы хотите работать с текущей базой данных (и, таким образом, сделать этот код переносимым), измените последнее условие 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;
Чтобы усечь таблицу, необходимо удалить ограничения внешнего ключа, сопоставленные столбцам в этой таблице, из других таблиц (фактически для всех таблиц в конкретной БД / Схеме).
Таким образом, все ограничения по внешнему ключу должны быть первоначально удалены, после чего следует усечение таблицы.
Дополнительно, используйте таблицу оптимизации (в mysql, innodb engine esp), чтобы вернуть используемое пространство / размер данных в ОС после усечения данных.
После усечения данных снова создайте те же ограничения внешнего ключа в той же таблице. Ниже приведен скрипт, который будет генерировать скрипт для выполнения вышеуказанных операций.
При использовании SQL Server 2005 существует скрытая хранимая процедура, которая позволяет вам выполнить команду или набор команд для всех таблиц в базе данных. Вот как бы вы вызывали TRUNCATE TABLEэту хранимую процедуру:
Для MySql, однако, вы могли бы использовать туздЫшпр и указать --add-drop-tablesи --no-dataопцию для падения и создать все таблицы , игнорируя данные. как это:
Вот мой вариант иметь «один оператор для усечения их всех».
Во-первых, я использую отдельную базу данных с именем «util» для своих вспомогательных хранимых процедур. Код моей хранимой процедуры для усечения всех таблиц:
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']);}?>
Вот процедура, которая должна обрезать все таблицы в локальной базе данных.
Дайте мне знать, если это не сработает, и я удалю этот ответ.
Непроверенные
CREATEPROCEDURE truncate_all_tables()BEGIN-- Declare local variablesDECLARE done BOOLEAN DEFAULT0;DECLARE cmd VARCHAR(2000);-- Declare the cursorDECLARE cmds CURSORFORSELECT CONCAT('TRUNCATE TABLE ', TABLE_NAME)FROM INFORMATION_SCHEMA.TABLES;-- Declare continue handlerDECLARECONTINUE HANDLER FOR SQLSTATE '02000'SET done=1;-- Open the cursorOPEN cmds;-- Loop through all rows
REPEAT
-- Get order numberFETCH cmds INTO cmd;-- Execute the command
PREPARE stmt FROM cmd;EXECUTE stmt;DROP PREPARE stmt;-- End of loop
UNTIL done END REPEAT;-- Close the cursorCLOSE cmds;END;
Я обнаружил, что TRUNCATE TABLE .. имеет проблемы с ограничениями внешнего ключа, даже после NOCHECK CONSTRAINT ALL, поэтому вместо этого я использую инструкцию DELETE FROM. Это означает, что семена идентичности не сбрасываются, для этого всегда можно добавить DBCC CHECKIDENT.
Я использую код ниже, чтобы распечатать в окне сообщений sql для усечения всех таблиц в базе данных, прежде чем запустить его. Просто сделать ошибку немного сложнее.
Я не уверен, но я думаю, что есть одна команда, с помощью которой вы можете скопировать схему базы данных в новую базу данных, как только вы это сделаете, вы можете удалить старую базу данных, а после этого вы можете снова скопировать схему базы данных в старое имя.
mysqldump -uuser -ppassword --no-data salesLeadsBrittany> salesLeadsTemplate.sql Это создаст файл sql только со схемой (без данных). Вы можете удалить базу данных после этой команды и восстановить базу данных, импортировав схему.
ГДж.
0
Я знаю, что это не совсем одна команда, но желаемый результат может быть достигнут из phpMyAdmin, выполнив следующие действия:
Выберите (все) таблицы, которые нужно удалить (Отметить все)
Выберите «Удалить» / «Обрезать» из списка «С выбранным:»
На странице подтверждения («Вы действительно хотите:») скопируйте запрос (все с красным фоном)
Перейдите вверх и нажмите на SQL и напишите: «SET FOREIGN_KEY_CHECKS = 0;» затем вставьте ранее скопированный запрос
Нажмите «Перейти»
Идея состоит в том, чтобы быстро получить все таблицы из базы данных (что вы делаете за 5 секунд и 2 клика), но сначала отключить проверку внешнего ключа. Нет CLI и нет удаления базы данных и добавления ее снова.
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"
утверждение_экстернальной_системы зависит от утверждения_просмотра
адрес зависит от клиента
идентификатор клиента зависит от клиента
external_id зависит от клиента
учетные данные зависят от клиента
адрес электронной почты зависит от клиента
утверждение - запрос зависит от клиента
customer_status зависит от клиента
customer_image зависит от клиента
Перечислите таблицы и количество строк:
klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'"| cat -n
1 address 2972 approval_external_system 03 approval_request 04 country 1895 credential 4686 customer 67767 customer_identification 56318 customer_image 29 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
Адрес усеченной таблицы
Усеченная таблицаopy_external_system
Усеченный стол Approval_request
Усеченный стол страна
Учетные данные усеченной таблицы
Усеченный стол заказчика
Усеченный стол customer_identification
Усеченный стол customer_image
Усеченный стол customer_status
Убедитесь, что это сработало:
klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'"| cat -n
1 address 02 approval_external_system 03 approval_request 04 country 05 credential 06 customer 07 customer_identification 08 customer_image 09 customer_status 010 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
Это приводит к потере всех ограничений, разрешений, представлений и т. Д. Для таблиц, что создает значительные неудобства.
Джонатан Леффлер
Вы можете сделать удаление, а затем заново заполнить все таблицы вместо усечения. Я предполагаю, что оценка вниз из-за разочарования. Просто восстановите свою резервную копию.
Эй, Джеймс, я думаю, что OP ищет, во-первых, одну строку… и, во-вторых, команду, чтобы получить все таблицы один раз и удалить их. это требует какого-то вмешательства пользователя. спасибо за пост, хотя
Ответы:
Отбросить (т.е. удалить таблицы)
Усекать (т.е. пустые таблицы)
источник
mysql -e "SET FOREIGN_KEY_CHECKS = 0; drop table $table" DATABASE_NAME
mysql -Nse 'show tables' DATABASE_NAME | while read table; do echo "drop table $table;"; done | mysql DATABASE_NAME
усекать несколько таблиц базы данных на экземпляре Mysql
Используйте Query Result для усечения таблиц
Примечание: возможно, вы получите эту ошибку:
Это происходит, если есть таблицы с ссылками на внешние ключи к таблице, которую вы пытаетесь удалить / усечь.
Перед усечением таблиц все, что вам нужно сделать, это:
Обрежьте свои таблицы и измените их обратно на
источник
Используйте phpMyAdmin следующим образом:
Если вы хотите игнорировать проверки внешнего ключа, вы можете снять флажок с надписью:
Вам нужно будет запустить как минимум версию 4.5.0 или выше, чтобы установить этот флажок.
Это не MySQL CLI-fu, но эй, это работает!
источник
MS SQL Server 2005+ (Удалить PRINT для фактического выполнения ...)
Если ваша платформа базы данных поддерживает представления INFORMATION_SCHEMA, возьмите результаты следующего запроса и выполните их.
Попробуйте это для MySQL:
Добавление точки с запятой в Concat упрощает использование, например, из среды MySQL.
источник
Я нашел это, чтобы удалить все таблицы в базе данных:
Полезно, если вы ограничены хостингом (не можете удалить всю базу данных).
Я изменил его, чтобы обрезать таблицы. Для mysqldump нет таблицы «--add-truncate-table», поэтому я сделал:
у меня работает --edit, исправление опечатки в последней команде
источник
источник
SELECT
на следующее:AND table_schema = DATABASE();
Я обнаружил, что проще всего сделать что-то вроде приведенного ниже кода, просто заменить имена таблиц своими собственными. важно убедиться, что последняя строка всегда SET FOREIGN_KEY_CHECKS = 1;
источник
Это напечатает команду для усечения всех таблиц:
источник
После усечения данных снова создайте те же ограничения внешнего ключа в той же таблице. Ниже приведен скрипт, который будет генерировать скрипт для выполнения вышеуказанных операций.
Теперь запустите сгенерированный скрипт Db Truncate.sql
Преимущества. 1) Восстановить дисковое пространство 2) Нет необходимости отбрасывать и воссоздавать БД / Схему с той же структурой
Недостатки. 1) Ограничения FK должны быть именами в таблице с именем, содержащим «FK» в имени ограничения.
источник
При использовании SQL Server 2005 существует скрытая хранимая процедура, которая позволяет вам выполнить команду или набор команд для всех таблиц в базе данных. Вот как бы вы вызывали
TRUNCATE TABLE
эту хранимую процедуру:Вот хорошая статья, которая развивается дальше.
Для MySql, однако, вы могли бы использовать туздЫшпр и указать
--add-drop-tables
и--no-data
опцию для падения и создать все таблицы , игнорируя данные. как это:Руководство по использованию mysqldump от dev.mysql
источник
Используйте это и сформируйте запрос
Теперь используйте это, чтобы использовать этот запрос
если вы получите ошибку, как это
самый простой способ пройти через это вверху файла добавить эту строку
который говорит, что мы не хотим проверять ограничения внешнего ключа при прохождении этого файла.
Он обрезает все таблицы в базах данных db1 и bd2.
источник
Нет. Нет единой команды для усечения всех таблиц mysql одновременно. Вам нужно будет создать небольшой скрипт для усечения таблиц по очереди.
ссылка: http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html
источник
Вот мой вариант иметь «один оператор для усечения их всех».
Во-первых, я использую отдельную базу данных с именем «util» для своих вспомогательных хранимых процедур. Код моей хранимой процедуры для усечения всех таблиц:
Как только у вас есть эта хранимая процедура в вашей базе данных утилит, вы можете назвать ее как
что сейчас ровно одно утверждение :-)
источник
здесь я знаю здесь
Если не удается удалить или обновить родительскую строку: ограничение внешнего ключа не выполняется
Это происходит, если есть таблицы с ссылками на внешние ключи к таблице, которую вы пытаетесь удалить / усечь.
Перед усечением таблиц все, что вам нужно сделать, это:
Обрежьте свои таблицы и измените их обратно на
используйте этот php код
проверить подробности здесь ссылка
источник
Вот процедура, которая должна обрезать все таблицы в локальной базе данных.
Дайте мне знать, если это не сработает, и я удалю этот ответ.
Непроверенные
источник
Я обнаружил, что TRUNCATE TABLE .. имеет проблемы с ограничениями внешнего ключа, даже после NOCHECK CONSTRAINT ALL, поэтому вместо этого я использую инструкцию DELETE FROM. Это означает, что семена идентичности не сбрасываются, для этого всегда можно добавить DBCC CHECKIDENT.
Я использую код ниже, чтобы распечатать в окне сообщений sql для усечения всех таблиц в базе данных, прежде чем запустить его. Просто сделать ошибку немного сложнее.
источник
Я не уверен, но я думаю, что есть одна команда, с помощью которой вы можете скопировать схему базы данных в новую базу данных, как только вы это сделаете, вы можете удалить старую базу данных, а после этого вы можете снова скопировать схему базы данных в старое имя.
источник
Я знаю, что это не совсем одна команда, но желаемый результат может быть достигнут из phpMyAdmin, выполнив следующие действия:
Идея состоит в том, чтобы быстро получить все таблицы из базы данных (что вы делаете за 5 секунд и 2 клика), но сначала отключить проверку внешнего ключа. Нет CLI и нет удаления базы данных и добавления ее снова.
источник
-
Дэвид,
Спасибо, что нашли время для форматирования кода, но это то, как он должен применяться.
-Kurt
На коробке UNIX или Linux:
Убедитесь, что вы находитесь в оболочке bash. Эти команды должны быть запущены из командной строки следующим образом.
Примечание:
Я храню свои учетные данные в моем файле ~ / .my.cnf, поэтому мне не нужно указывать их в командной строке.
Примечание:
cpm - это имя базы данных
Я показываю только небольшую выборку результатов из каждой команды.
Найдите ограничения внешнего ключа:
Перечислите таблицы и количество строк:
Обрежьте свои таблицы:
Убедитесь, что это сработало:
На коробке Windows:
НОТА:
cpm - это имя базы данных
источник
Следующий запрос MySQL сам создаст один запрос, который будет обрезать все таблицы в данной базе данных. Он обходит иностранные ключи:
источник
источник
Солн 1)
Soln 2)
-- редактировать ----
источник
Это сработало для меня. Измените базу данных, имя пользователя и пароль соответственно.
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
источник
Идея может быть просто удалить и воссоздать таблицы?
РЕДАКТИРОВАТЬ:
@ Джонатан Леффлер: Правда
Другое предложение (или если вам не нужно обрезать ВСЕ таблицы):
Почему бы просто не создать базовую хранимую процедуру для усечения определенных таблиц
источник
Вот фрагмент кода, который я использую для очистки таблицы. Просто измените $ conn info и TABLE_NAME.
источник