거기에있을 수있는 외래 키 제약 조건을 무시하고 MySQL 데이터베이스에서 모든 테이블을 삭제하는 좋은 방법이 있습니까?
Drop
하고 드롭 다운 메뉴에서 선택하면 Foreign key check
확인란 을 선택 취소 할 수 있습니다 .
거기에있을 수있는 외래 키 제약 조건을 무시하고 MySQL 데이터베이스에서 모든 테이블을 삭제하는 좋은 방법이 있습니까?
Drop
하고 드롭 다운 메뉴에서 선택하면 Foreign key check
확인란 을 선택 취소 할 수 있습니다 .
답변:
생성 된 drop 문 집합이 유용하다는 것을 알았고 다음과 같은 조정을 권장합니다.
SELECT concat('DROP TABLE IF EXISTS `', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'MyDatabaseName';
참고 1 : 이것은 DROP 문을 실행하지 않고 단지 목록을 제공합니다. 출력을 잘라내어 SQL 엔진에 붙여 넣어 실행해야합니다.
참고 2 : VIEW가있는 경우 각 DROP TABLE `VIEW_NAME`
명령문을 DROP VIEW `VIEW_NAME`
수동으로 수정 해야합니다.
"RESTRICT와 CASCADE는 포팅을보다 쉽게 만들어줍니다. MySQL 5.5에서는 아무 것도하지 않습니다."
따라서 필요한 경우 drop 문이 작동하려면 다음을 수행하십시오.
SET FOREIGN_KEY_CHECKS = 0
이렇게하면 참조 무결성 검사가 비활성화됩니다. 따라서 필요한 드롭 수행이 완료되면 키 검사를 재설정해야합니다.
SET FOREIGN_KEY_CHECKS = 1
SET FOREIGN_KEY_CHECKS = 0;
-- Your semicolon separated list of DROP statements here
SET FOREIGN_KEY_CHECKS = 1;
NB : SELECT의 출력을 더 쉽게 사용하려면 mysql -B 옵션이 도움이 될 수 있습니다.
DROP DATABASE foo; CREATE DATABASE foo;
. 이는 똑같지는 않지만 나를 위해 일했습니다.
에서 http://www.devdaily.com/blog/post/mysql/drop-mysql-tables-in-any-order-foreign-keys :
SET FOREIGN_KEY_CHECKS = 0;
drop table if exists customers;
drop table if exists orders;
drop table if exists order_details;
SET FOREIGN_KEY_CHECKS = 1;
(주이 자동으로 기존의 모든 테이블에 대한 드롭 테이블 문을 생성하는 방법에 답하고 하나의 스크립트를 실행하지 않는 방법을 사용하지 않도록 외래 키 검사에 임의의 순서로 테이블을 드롭 할 수 있도록하기 위해..이 답변 진의 대답을 그렇습니다.)
외래 키를 무시하도록 SurlyDre의 저장 프로 시저가 수정되었습니다.
DROP PROCEDURE IF EXISTS `drop_all_tables`;
DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
DECLARE _done INT DEFAULT FALSE;
DECLARE _tableName VARCHAR(255);
DECLARE _cursor CURSOR FOR
SELECT table_name
FROM information_schema.TABLES
WHERE table_schema = SCHEMA();
DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;
SET FOREIGN_KEY_CHECKS = 0;
OPEN _cursor;
REPEAT FETCH _cursor INTO _tableName;
IF NOT _done THEN
SET @stmt_sql = CONCAT('DROP TABLE ', _tableName);
PREPARE stmt1 FROM @stmt_sql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END IF;
UNTIL _done END REPEAT;
CLOSE _cursor;
SET FOREIGN_KEY_CHECKS = 1;
END$$
DELIMITER ;
call drop_all_tables();
DROP PROCEDURE IF EXISTS `drop_all_tables`;
_tableName
역 따옴표로 감싸 야한다고 말하고 싶습니다 . 그렇지 않으면 일부 테이블 group
또는 다른 키워드 에서 실패 합니다.
위의 모든 접근 방식에는이 AFAICT보다 훨씬 많은 작업이 포함됩니다 ...
( mysqldump --add-drop-table --no-data -u root -p database | grep 'DROP TABLE' ) > ./drop_all_tables.sql
mysql -u root -p database < ./drop_all_tables.sql
mysqldump
에 mysql
파일을 거치지 않고,?
mysqldump
에 grep
삽입 mysql
했다. 솔루션에 다시 한 번 감사드립니다. 좋습니다.
에서 이 답변 ,
실행 :
use `dbName`; --your db name here
SET FOREIGN_KEY_CHECKS = 0;
SET @tables = NULL;
SET GROUP_CONCAT_MAX_LEN=32768;
SELECT GROUP_CONCAT('`', table_schema, '`.`', table_name, '`') INTO @tables
FROM information_schema.tables
WHERE table_schema = (SELECT DATABASE());
SELECT IFNULL(@tables, '') INTO @tables;
SET @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;
현재 사용중인 데이터베이스에서 테이블이 삭제됩니다. 를 사용하여 현재 데이터베이스를 설정할 수 있습니다 use
.
그렇지 않으면 Dion의 허용 된 대답은 더 간단합니다. 먼저 쿼리를 얻기 위해 두 번 실행하고 쿼리를 실행하려면 두 번째로 실행해야합니다. db 및 테이블 이름의 특수 문자를 피하기 위해 바보 같은 백틱을 제공했습니다.
SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'dbName'; --your db name here
커서 기반 솔루션은 다음과 같습니다. 오래 걸리지 만 단일 SQL 배치로 작동합니다.
DROP PROCEDURE IF EXISTS `drop_all_tables`;
DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
DECLARE _done INT DEFAULT FALSE;
DECLARE _tableName VARCHAR(255);
DECLARE _cursor CURSOR FOR
SELECT table_name
FROM information_schema.TABLES
WHERE table_schema = SCHEMA();
DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;
OPEN _cursor;
REPEAT FETCH _cursor INTO _tableName;
IF NOT _done THEN
SET @stmt_sql = CONCAT('DROP TABLE ', _tableName);
PREPARE stmt1 FROM @stmt_sql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END IF;
UNTIL _done END REPEAT;
CLOSE _cursor;
END$$
DELIMITER ;
call drop_all_tables();
DROP PROCEDURE IF EXISTS `drop_all_tables`;
넌 할 수있어:
select concat('drop table if exists ', table_name, ' cascade;')
from information_schema.tables;
그런 다음 생성 된 쿼리를 실행하십시오. 현재 데이터베이스에서 모든 단일 테이블을 삭제합니다.
다음 은 drop table
명령에 대한 도움말입니다 .
||
연결 연산자로 설정되어 있다고 가정합니다 . 보다 구체적으로, MySQL SQL 모드는를 포함 PIPES_AS_CONCAT
합니다. 참조 : dev.mysql.com/doc/refman/5.0/en/…
concat
대신||
Dion Truter의 답변 에서이 수정 사항을 생각해내어 많은 테이블을 쉽게 만들 수 있습니다.
SET GROUP_CONCAT_MAX_LEN = 10000000;
SELECT CONCAT('SET FOREIGN_KEY_CHECKS=0;\n',
GROUP_CONCAT(CONCAT('DROP TABLE IF EXISTS `', table_name, '`')
SEPARATOR ';\n'),
';\nSET FOREIGN_KEY_CHECKS=1;')
FROM information_schema.tables
WHERE table_schema = 'SchemaName';
전체 항목을 한 필드에 반환하므로 한 번 복사하고 모든 테이블을 삭제할 수 있습니다 ( Copy Field Content (unquoted)
워크 벤치에서 사용 ). 테이블이 많으면에 제한이있을 수 있습니다 GROUP_CONCAT()
. 그렇다면 max len 변수를 늘리십시오 ( max_allowed_packet
필요한 경우).
주제에 대한 인터넷 검색은 항상이 SO 질문으로 이어 지므로 두 테이블과 뷰를 모두 삭제하는 mysql 코드가 작동합니다.
DROP PROCEDURE IF EXISTS `drop_all_tables`;
DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
DECLARE _done INT DEFAULT FALSE;
DECLARE _tableName VARCHAR(255);
DECLARE _cursor CURSOR FOR
SELECT table_name
FROM information_schema.TABLES
WHERE table_schema = SCHEMA();
DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;
SET FOREIGN_KEY_CHECKS = 0;
OPEN _cursor;
REPEAT FETCH _cursor INTO _tableName;
IF NOT _done THEN
SET @stmt_sql1 = CONCAT('DROP TABLE IF EXISTS ', _tableName);
SET @stmt_sql2 = CONCAT('DROP VIEW IF EXISTS ', _tableName);
PREPARE stmt1 FROM @stmt_sql1;
PREPARE stmt2 FROM @stmt_sql2;
EXECUTE stmt1;
EXECUTE stmt2;
DEALLOCATE PREPARE stmt1;
DEALLOCATE PREPARE stmt2;
END IF;
UNTIL _done END REPEAT;
CLOSE _cursor;
SET FOREIGN_KEY_CHECKS = 1;
END$$
DELIMITER ;
call drop_all_tables();
DROP PROCEDURE IF EXISTS `drop_all_tables`;
주어진 데이터베이스에서 모든 테이블을 삭제하는 하나의 라이너 :
echo "DATABASE_NAME"| xargs -I{} sh -c "mysql -Nse 'show tables' {}| xargs -I[] mysql -e 'SET FOREIGN_KEY_CHECKS=0; drop table []' {}"
이를 실행하면 DATABASE_NAME 데이터베이스에서 모든 테이블이 삭제됩니다.
그리고 이것에 대한 좋은 점은 데이터베이스 이름이 명시 적으로 한 번만 쓰여진다는 것입니다.
다음은 bash 스크립트를 통해 자동으로 수행하는 방법입니다.
host=$1
dbName=$2
user=$3
password=$4
if [ -z "$1" ]
then
host="localhost"
fi
# drop all the tables in the database
for i in `mysql -h$host -u$user -p$password $dbName -e "show tables" | grep -v Tables_in` ; do echo $i && mysql -h$host -u$user -p$password $dbName -e "SET FOREIGN_KEY_CHECKS = 0; drop table $i ; SET FOREIGN_KEY_CHECKS = 1" ; done
리눅스 (또는 파이핑, 에코 및 grep를 지원하는 다른 시스템)에서 한 줄로 할 수 있습니다.
echo "SET FOREIGN_KEY_CHECKS = 0;" > temp.txt; \
mysqldump -u[USER] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP >> temp.txt; \
echo "SET FOREIGN_KEY_CHECKS = 1;" >> temp.txt; \
mysql -u[USER] -p[PASSWORD] [DATABASE] < temp.txt;
나는 이것이 오래된 질문이라는 것을 알고 있지만이 방법은 빠르고 간단하다고 생각합니다.
PHP에서는 다음과 같이 쉽습니다.
$pdo = new PDO('mysql:dbname=YOURDB', 'root', 'root');
$pdo->exec('SET FOREIGN_KEY_CHECKS = 0');
$query = "SELECT concat('DROP TABLE IF EXISTS ', table_name, ';')
FROM information_schema.tables
WHERE table_schema = 'YOURDB'";
foreach($pdo->query($query) as $row) {
$pdo->exec($row[0]);
}
$pdo->exec('SET FOREIGN_KEY_CHECKS = 1');
YOURDB를 데이터베이스 이름과 사용자 / 패스로 변경해야합니다.
bash / zsh와 같은 Linux 쉘에서 :
DATABASE_TO_EMPTY="your_db_name";
{ echo "SET FOREIGN_KEY_CHECKS = 0;" ; \
mysql "$DATABASE_TO_EMPTY" --skip-column-names -e \
"SELECT concat('DROP TABLE IF EXISTS ', table_name, ';') \
FROM information_schema.tables WHERE table_schema = '$DATABASE_TO_EMPTY';";\
} | mysql "$DATABASE_TO_EMPTY"
그러면 명령이 생성 된 다음 즉시 두 번째 클라이언트 인스턴스로 파이프되어 테이블을 삭제합니다.
영리한 비트는 물론 여기에서 다른 답변에서 복사됩니다. 실제로 OP를 원했던 작업을 수행 하기 위해 복사하여 붙여 넣을 수있는 1 라이너 (ish)가 필요 했습니다.
주 당신이 매우 낮은 보안 설정이없는 경우도이 MySQL의 명령에 (2 회)에 자격 증명을 넣어해야합니다 물론. (또는 creds를 포함하도록 mysql 명령의 별명을 지정할 수 있습니다.)
모든 테이블을 삭제하기 위해 Jonathan Watt 가 작성한 유용한 주석을 여기에 넣으십시오.
MYSQL="mysql -h HOST -u USERNAME -pPASSWORD DB_NAME"
$MYSQL -BNe "show tables" | awk '{print "set foreign_key_checks=0; drop table `" $1 "`;"}' | $MYSQL
unset MYSQL
도움이 되었으면 좋겠습니다.
명령 행에서 한 줄로 데이터베이스에서 모든 테이블을 삭제하십시오.
mysqldump -u [user_name] -p[password] -h [host_name] --add-drop-table --no-data [database_name] | grep ^DROP | mysql -u [user_name] -p[password] -h [host_name] [database_name]
여기서 [user_name], [password], [host_name] 및 [database_name]은 실제 데이터 (사용자, 비밀번호, 호스트 이름, 데이터베이스 이름)로 바꿔야합니다.
이것은 꽤 오래된 게시물이지만 여기에 대한 답변 중 실제로 내 의견으로는 질문에 대한 답변이 없으므로 내 게시물이 사람들을 도울 수 있기를 바랍니다.
나에게 정말 잘 맞는 다른 질문 에서이 솔루션을 찾았습니다.
mysql -Nse 'show tables' DB_NAME | while read table; do mysql -e "SET FOREIGN_KEY_CHECKS=0; truncate table \`$table\`" DB_NAME; done
실제로 데이터베이스의 모든 테이블을 비우고 DB_NAME
표시 할뿐만 아니라TRUNCATE
명령 줄만 됩니다.
도움이 되었기를 바랍니다!
@Dion Truter와 @Wade Williams의 답변을 바탕으로 다음 셸 스크립트는 실행 예정을 표시하고 Ctrl-C를 사용하여 중단 할 수있는 기회를 제공 한 후 모든 테이블을 삭제합니다.
#!/bin/bash
DB_HOST=xxx
DB_USERNAME=xxx
DB_PASSWORD=xxx
DB_NAME=xxx
CMD="mysql -sN -h ${DB_HOST} -u ${DB_USERNAME} -p${DB_PASSWORD} ${DB_NAME}"
# Generate the drop statements
TMPFILE=/tmp/drop-${RANDOM}.sql
echo 'SET FOREIGN_KEY_CHECKS = 0;' > ${TMPFILE}
${CMD} $@ >> ${TMPFILE} << ENDD
SELECT concat('DROP TABLE IF EXISTS \`', table_name, '\`;')
FROM information_schema.tables
WHERE table_schema = '${DB_NAME}';
ENDD
echo 'SET FOREIGN_KEY_CHECKS = 1;' >> ${TMPFILE}
# Warn what we are about to do
echo
cat ${TMPFILE}
echo
echo "Press ENTER to proceed (or Ctrl-C to abort)."
read
# Run the SQL
echo "Dropping tables..."
${CMD} $@ < ${TMPFILE}
echo "Exit status is ${?}."
rm ${TMPFILE}
이 솔루션은 @SkyLeach 답변을 기반으로하지만 외래 키로 테이블을 삭제하는 기능을 지원합니다.
echo "SET FOREIGN_KEY_CHECKS = 0;" > ./drop_all_tables.sql
mysqldump --add-drop-table --no-data -u user -p dbname | grep 'DROP TABLE' >> ./drop_all_tables.sql
echo "SET FOREIGN_KEY_CHECKS = 1;" >> ./drop_all_tables.sql
mysql -u user -p dbname < ./drop_all_tables.sql
DB="your database name" \
&& mysql $DB < "SET FOREIGN_KEY_CHECKS=0" \
&& mysqldump --add-drop-table --no-data $DB | grep 'DROP TABLE' | grep -Ev "^$" | mysql $DB \
&& mysql $DB < "SET FOREIGN_KEY_CHECKS=1"
간단하고 명확합니다.
멋진 해결책은 아니지만 이것이 효과가 있었고 하루를 구했습니다.
서버 버전에서 작동 함 : 5.6.38 MySQL 커뮤니티 서버 (GPL)
내가 따르는 단계 :
1. generate drop query using concat and group_concat.
2. use database
3. disable key constraint check
4. copy the query generated from step 1
5. enable key constraint check
6. run show table
MySQL 쉘
mysql> SYSTEM CLEAR;
mysql> SELECT CONCAT('DROP TABLE IF EXISTS `', GROUP_CONCAT(table_name SEPARATOR '`, `'), '`;') AS dropquery FROM information_schema.tables WHERE table_schema = 'emall_duplicate';
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| dropquery |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`; |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> USE emall_duplicate;
Database changed
mysql> SET FOREIGN_KEY_CHECKS = 0; Query OK, 0 rows affected (0.00 sec)
// copy and paste generated query from step 1
mysql> DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`;
Query OK, 0 rows affected (0.18 sec)
mysql> SET FOREIGN_KEY_CHECKS = 1;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW tables;
Empty set (0.01 sec)
mysql>
MSSQL 서버에서 다음을 사용합니다.
if (DB_NAME() = 'YOUR_DATABASE')
begin
while(exists(select 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='FOREIGN KEY'))
begin
declare @sql nvarchar(2000)
SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
FROM information_schema.table_constraints
WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
exec (@sql)
PRINT @sql
end
while(exists(select 1 from INFORMATION_SCHEMA.TABLES))
begin
declare @sql2 nvarchar(2000)
SELECT TOP 1 @sql2=('DROP TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']')
FROM INFORMATION_SCHEMA.TABLES
exec (@sql2)
PRINT @sql2
end
end
else
print('Only run this script on the development server!!!!')
YOUR_DATABASE를 데이터베이스 이름으로 바꾸거나 전체 IF 문을 제거하십시오 (추가 안전이 마음에 듭니다).
최고의 솔루션지금까지 적합한
데이터베이스-> 마우스 오른쪽 단추-> 작업-> 스크립트 생성을 선택 하십시오-스크립트 생성을 위한 마법사가 열립니다. 스크립팅 옵션 설정에서 오브젝트를 선택한 후 고급 단추를 클릭하십시오 . "Script DROP and CREATE" 아래 에서 Script DROP을 선택하십시오 .
스크립트를 실행하십시오.