한 번의 작업으로 데이터베이스의 모든 테이블을 잘라내는 쿼리 (명령)가 있습니까? 하나의 쿼리 로이 작업을 수행 할 수 있는지 알고 싶습니다.
한 번의 작업으로 데이터베이스의 모든 테이블을 잘라내는 쿼리 (명령)가 있습니까? 하나의 쿼리 로이 작업을 수행 할 수 있는지 알고 싶습니다.
답변:
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 테이블을 한 번에 자르는 명령은 없습니다. 테이블을 하나씩 자르려면 작은 스크립트를 작성해야합니다.
심판 : http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html
다음은 'em all'을 잘라내는 하나의 문장을 갖는 변형입니다.
먼저 도우미 저장 프로 시저에 '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');
이것은 정확히 하나의 진술입니다 :-)
여기 내가 여기에 알고
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'''
확실하지 않지만 데이터베이스 스키마를 새 데이터베이스로 복사 할 수있는 명령이 하나 있다고 생각합니다.이 작업을 수행하면 이전 데이터베이스를 삭제할 수 있으며이 후 데이터베이스 스키마를 다시 이전 이름으로 복사 할 수 있습니다.
나는 이것이 정확히 하나의 명령이 아니라는 것을 알고 있지만 다음 단계에 따라 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
아이디어는 테이블을 삭제하고 다시 만드는 것일 수 있습니까?
편집하다:
@Jonathan Leffler : 사실
다른 제안 (또는 모든 테이블을자를 필요가없는 경우) :
특정 테이블을 자르기 위해 기본 저장 프로 시저를 만드는 것이 어떻습니까?
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을 변경하십시오.