ฉันต้องวางตารางทั้งหมดในฐานข้อมูลโดยไม่ทราบชื่อก่อน โพรซีเดอร์ทั่วไปคือการดร็อปและสร้างฐานข้อมูลขึ้นใหม่ แต่นี่ไม่ใช่ตัวเลือก วิธีที่ดีที่สุดที่จะทำคืออะไร?
ฉันต้องวางตารางทั้งหมดในฐานข้อมูลโดยไม่ทราบชื่อก่อน โพรซีเดอร์ทั่วไปคือการดร็อปและสร้างฐานข้อมูลขึ้นใหม่ แต่นี่ไม่ใช่ตัวเลือก วิธีที่ดีที่สุดที่จะทำคืออะไร?
คำตอบ:
มี bash one-liner ที่ง่ายกว่าโดยใช้ mysqldump (จากThingy Ma Jig Blog )
mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP | mysql -u[USERNAME] -p[PASSWORD] [DATABASE]
หากคุณได้รับข้อผิดพลาดนี้:
ERROR 1217 (23000) at line 1: Cannot delete or update a parent row:
a foreign key constraint fails
ลองทำสิ่งต่อไปนี้:
(echo 'SET foreign_key_checks = 0;';
(mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] |
grep ^DROP);
echo 'SET foreign_key_checks = 1;') | \
mysql -u[USERNAME] -p[PASSWORD] -b [DATABASE]
ตอนนี้มันไม่สนใจข้อ จำกัด
คุณควรใช้information_schemaตารางสามารถดึงข้อมูลเมตาดาต้าเกี่ยวกับฐานข้อมูลและจากนั้นวางตารางที่ระบุไว้มี
คุณสามารถลองใช้ shell shell แบบด่วนได้เช่นกัน:
#!/bin/bash
IFS=$'\n'
for table in `mysql <databaseName> -N -e 'show tables'`; do
echo mysql <databaseName> -e "drop table $table"
done
ลบecho
หลังจากที่คุณตรวจสอบแล้วว่ามันจะทำสิ่งที่คุณคาดหวัง
$''
ทำให้ bash ตีความลำดับแบ็กสแลชแทนการใช้พวกมันอย่างแท้จริง '\n'
จะมี \ n เหมือนทุกอย่างซึ่ง$IFS
จะเข้าใจได้ว่าจะแยกอักขระ \ และ n $'\n'
จะมีอักขระขึ้นบรรทัดใหม่ 0x0D ลองดูที่นี่สำหรับข้อมูลเพิ่มเติม: gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting
มีรายการในบล็อก Xaprbเมื่อเร็ว ๆ นี้ซึ่งครอบคลุมเรื่องนี้เป็นอย่างดี
ซึ่งจะรวมถึงเหตุผลที่ใช้INFORMATION_SCHEMA
ไม่ได้เป็นสิ่งที่ดีเสมอและการอ้างอิงเครื่องมือจากคนที่น่ารักที่Maatkit
ลองทำสิ่งต่อไปนี้ด้วยmk-find
:
mk-find '<database>' --printf 'DROP TABLE %D.%N'
หากคุณพอใจกับผลลัพธ์ที่ได้แล้ว:
mk-find '<database>' --exec 'DROP TABLE %D.%N'
หากคุณมีการเข้าถึงระบบไฟล์ก็แค่rm -rf databasename/*
:)
คำสั่งฐานข้อมูลหล่นทำแบบเดียวกัน ... ข้อความที่ตัดตอนมาจากคู่มือ MySQL:
คำสั่ง DROP ฐานข้อมูลลบออกจากไดเรกทอรีฐานข้อมูลที่กำหนดไฟล์และไดเรกทอรีที่ MySQL เองอาจสร้างขึ้นในระหว่างการทำงานปกติ: