จะวางตารางทั้งหมดในฐานข้อมูล MySQL โดยไม่ต้องวางฐานข้อมูลได้อย่างไร


12

ฉันต้องวางตารางทั้งหมดในฐานข้อมูลโดยไม่ทราบชื่อก่อน โพรซีเดอร์ทั่วไปคือการดร็อปและสร้างฐานข้อมูลขึ้นใหม่ แต่นี่ไม่ใช่ตัวเลือก วิธีที่ดีที่สุดที่จะทำคืออะไร?


1
อาจจะต้องถามคำถามนี้ล่วงหน้า แต่ก็สายดีกว่าไม่คิดว่า: OS อะไร?
Jeff Snider

Unix / Linux เช่น OS
นางฟ้าเชียง

คำตอบ:


18

มี 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]

ตอนนี้มันไม่สนใจข้อ จำกัด


5

คุณควรใช้information_schemaตารางสามารถดึงข้อมูลเมตาดาต้าเกี่ยวกับฐานข้อมูลและจากนั้นวางตารางที่ระบุไว้มี


3

คุณสามารถลองใช้ 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หลังจากที่คุณตรวจสอบแล้วว่ามันจะทำสิ่งที่คุณคาดหวัง


ทำไมคุณถึงเขียน '$' ก่อนค่าของ IFS ทำไมมันไม่เหมือน "IFS = '\ n'"
kolypto

@o_OTync การใช้$''ทำให้ bash ตีความลำดับแบ็กสแลชแทนการใช้พวกมันอย่างแท้จริง '\n'จะมี \ n เหมือนทุกอย่างซึ่ง$IFSจะเข้าใจได้ว่าจะแยกอักขระ \ และ n $'\n'จะมีอักขระขึ้นบรรทัดใหม่ 0x0D ลองดูที่นี่สำหรับข้อมูลเพิ่มเติม: gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting
เจฟฟ์ Snider

ฉันคิดว่าวิธีนี้ง่ายกว่าการใช้ INFORMATION_SCHEMA
Angel Chiang

0

มีรายการในบล็อก Xaprbเมื่อเร็ว ๆ นี้ซึ่งครอบคลุมเรื่องนี้เป็นอย่างดี

ซึ่งจะรวมถึงเหตุผลที่ใช้INFORMATION_SCHEMAไม่ได้เป็นสิ่งที่ดีเสมอและการอ้างอิงเครื่องมือจากคนที่น่ารักที่Maatkit

ลองทำสิ่งต่อไปนี้ด้วยmk-find:

mk-find '<database>' --printf 'DROP TABLE %D.%N'

หากคุณพอใจกับผลลัพธ์ที่ได้แล้ว:

mk-find '<database>' --exec 'DROP TABLE %D.%N'

-2

หากคุณมีการเข้าถึงระบบไฟล์ก็แค่rm -rf databasename/*:)

คำสั่งฐานข้อมูลหล่นทำแบบเดียวกัน ... ข้อความที่ตัดตอนมาจากคู่มือ MySQL:

คำสั่ง DROP ฐานข้อมูลลบออกจากไดเรกทอรีฐานข้อมูลที่กำหนดไฟล์และไดเรกทอรีที่ MySQL เองอาจสร้างขึ้นในระหว่างการทำงานปกติ:


2
ความคิดที่ไม่ดีอย่างยิ่งสำหรับการตั้งค่าที่ไม่สำคัญเนื่องจาก MySQL ไม่ได้คาดหวังว่าไฟล์เหล่านี้จะหายไปอย่างกระทันหันและอาจอยู่ในช่วงกลางของการดำเนินการธุรกรรมการจำลองแบบล็อค ...
bot403

คุณจะพิจารณาทบทวนคำตอบของคุณอีกครั้งเพื่อรวมคำสั่งและขั้นตอนที่เหมาะสมหรือไม่?
bot403
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.