1回の操作でデータベース内のすべてのテーブルを切り捨てるクエリ(コマンド)はありますか?これを1つのクエリで実行できるかどうかを知りたいです。
1回の操作でデータベース内のすべてのテーブルを切り捨てるクエリ(コマンド)はありますか?これを1つのクエリで実行できるかどうかを知りたいです。
回答:
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
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インスタンスの複数のデータベーステーブルを切り捨てる
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;
次のようにphpMyAdminを使用します。
データベースビュー=>すべてチェック(テーブル)=>空
外部キーのチェックを無視したい場合は、次のボックスのチェックを外してください:
[]外部キーチェックを有効にする
このチェックボックスを取得するには、少なくともバージョン4.5.0以降を実行している必要があります。
MySQL CLI-fuではありませんが、動作します。
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
私はこれがデータベースのすべてのテーブルを削除することを発見しました:
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
私のために働く-編集、最後のコマンドのタイプミスを修正
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();
以下のコードのようにするだけで、テーブル名を自分の名前に置き換えるのが最も簡単だと思いました。 重要なのは、最終行が常に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;
データの切り捨てが実行されたら、同じテーブルに同じ外部キー制約を再度作成します。上記の操作を実行するスクリプトを生成するスクリプトを以下に示します。
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)同じ構造のDB /スキーマを削除して再作成する必要はありません
欠点。1)FK制約は、制約名に「FK」を含む名前のテーブル内の名前である必要があります。
SQL Server 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]
これを使用してクエリを作成します
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内のすべてのテーブルが切り捨てられます。
いいえ。すべてのmysqlテーブルを一度に切り捨てる単一のコマンドはありません。テーブルを1つずつ切り捨てる小さなスクリプトを作成する必要があります。
参照:http : //dev.mysql.com/doc/refman/5.0/en/truncate-table.html
これが、 'em all'を切り捨てる1つのステートメントを持つ私の変種です。
まず、ヘルパーストアドプロシージャに「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 ;
utilデータベースにこのストアドプロシージャを作成したら、次のように呼び出すことができます。
call util.trunctables('nameofdatabase');
これはちょうど1つのステートメントになりました:-)
ここで私はここで知っています
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']);
}
?>
詳細はこちらリンクをチェック
次に、ローカルデータベースのすべてのテーブルを切り捨てる手順を示します。
動作しない場合はお知らせください。この回答は削除します。
未テスト
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;
NOCHECK CONSTRAINT ALLを実行した後でも、TRUNCATE TABLE ..が外部キー制約に問題があるため、代わりにDELETE FROMステートメントを使用しています。これは、IDシードがリセットされないことを意味します。これを行うには、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'''
これは1つのコマンドではないことはわかっていますが、phpMyAdmin内から次の手順を実行することで、目的の結果を得ることができます。
アイデアは、データベースからすべてのテーブルをすばやく取得することです(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
-
デビッド、
コードのフォーマットに時間を割いていただきありがとうございますが、これがコードの適用方法です。
-カート
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"
テーブルと行数をリストします。
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
機能したことを確認します。
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
次のMySQLクエリ自体が、特定のデータベースのすべてのテーブルを切り捨てる単一のクエリを生成します。FOREIGNキーをバイパスします。
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
ソルン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;
ソルン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
テーブルを単にドロップして再作成するというアイデアでしょうか?
編集:
@ジョナサンレフラー:真
その他の提案(またはすべてのテーブルを切り捨てる必要がない場合):
特定のテーブルを切り捨てるための基本的なストアドプロシージャを作成しないのはなぜですか
CREATE PROCEDURE [dbo].[proc_TruncateTables]
AS
TRUNCATE TABLE Table1
TRUNCATE TABLE Table2
TRUNCATE TABLE Table3
GO
<?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を変更するだけです。