Ștergerea în masă a tabelelor mysql pe un prefix, direqtor

Când lucrați cu un CMS diferit, este adesea necesar să ștergeți dintr-o dată un număr mare de tabele cu un singur prefix în baza de date MySQL. Mai ales în cazul în care o bază de date este folosită de mai multe sisteme cu propriile prefixe.







Voi lăsa aici pentru mine și vizitatori câteva opțiuni

Această metodă se află pe diferite resurse din rețea. Trebuie să executați interogarea înlocuindu-vă prefixul. care va returna textul unei noi cereri de ștergere a tabelelor:

SELECT GROUP_CONCAT # 40; "TABEL DE DROP". table_name. ';' SEPARATOR " # 41; Declarație AS
FROM information_schema. tabele
WHERE table_name LIKE "prefixul \ _%";

Concluzia trebuie verificată cu ochii. GROUP_CONCAT îl trunchiază de-a lungul lungimii variabilei group_concat_max_len (implicit este 1024). Prin urmare, deja cu 20-25 de mese veți primi o cerere eronată.

Puteți lua în considerare acest lucru în felul următor:

SET SESIUNE group_concat_max_len = 1000000;
SELECT GROUP_CONCAT # 40; "TABEL DE DROP". table_name. ';' SEPARATOR " # 41; Declarație AS
FROM information_schema. tabele
WHERE table_name LIKE "prefixul \ _%";

Rezultatul rezultat este o cerere de ștergere a tabelelor necesare, care trebuie executate în orice mod în MySQL. Această metodă este cea mai convenabilă pentru utilizarea unei interfețe web (de exemplu phpMyAdmin) sau a clienților de ferestre (de exemplu, MySQL Workbench).

Cu toate acestea, rezultatul cererii este mai lung decât max_allowed_packet (4Gb implicit) și nu va funcționa. Dar, cred, patru gigaocteți vor fi suficienți pentru toată lumea. )

Doar versiunea originală podrihtoval la preferințele dvs.

SELECTAȚI CONCAT # 40; "TABEL DROP DACĂ EXISTĂ" ". GROUP_CONCAT # 40; table_name. "," SEPARATOR " # 41;. ''; ' # 41; Declarație AS
FROM information_schema. tabele
WHERE table_name LIKE "prefixul \ _%";








Avantajele acestei versiuni sunt clare:

  • serverul primește o cerere și nu este violat de un pachet de sute de DROP-uri, deoarece va funcționa mai repede;
  • codul este de două ori mai scurt, respectiv, într-o limită de 1024 de caractere, se va potrivi de două ori mai multe tabele;
  • codul nu va arunca o eroare atunci când lungimea șirului depășește group_concat_max_len;
  • dacă constrângerile sunt depășite, după prima interogare, puteți genera pur și simplu o interogare nouă, deoarece tabelele care au fost deja incluse în ea vor fi deja șterse, restul le vor lua locul;
  • numele de tabele sunt protejate prin ghilimele `` în cazul coincidenței numelor de tabele cu cuvinte cheie SQL;

Metoda este, de asemenea, potrivită pentru cei care folosesc interfața web (de exemplu, phpMyAdmin) sau clienții de ferestre (de exemplu, MySQL Workbench).

Opțiune pentru BASH

Nu există restricții. O listă simplă de tabele este afișată în linia de comandă (CLI) a interpretului bash. Întrebarea DROP TABLE este generată de comenzile shell și executată din nou de utilitarul client mysql.

ecou ", precum" PREFIX \ _% "" \ # Facem o interogare pentru a obține o listă de tabele. Înlocuiți PREFIX \ _ cu cel dorit.
mysql -N-u UTILIZATOR - Baza de date a pachetului \ # Trimiteți cererea către MySQL. Opțiunea -N trunchiază ieșirea antetului coloanei.
sed '/ ^^^^^^^^ \ # Ștergeți linii goale doar în caz.
sed 's /.\+/ `` /' \ # Închideți numele tabelului în cotele de protecție ``.
sed ': a; N; $! ba; s / \ n /, / g' | \ # Această sed-o-vrăjitoare leagă toate liniile într-una cu o virgulă.
sed 's /^.\+/ TABEL DROP DACĂ EXISTĂ ; / ' \ # Adăugăm interogarea SQL.
mysql -u UTILIZATOR -PAPASA DATABASE # Trimite cererea catre MySQL pentru a fi executata.
# În liniile 3 și 7, specificați parametrii de conectare la baza de date.
# USER este numele de utilizator în MySQL.
# PASS este parola utilizatorului (nu este nevoie de un spațiu între -p și PASS). Puteți lăsa opțiunea -p goală și introduceți parola de două ori.
# DATABASE este numele bazei de date cu care lucrați.


Comanda bash pentru a șterge tabelele într-o singură linie.

ecou ", precum" PREFIX \ _% "" mysql -N-u UTILIZATOR - Baza de date a pachetului sed '/ ^^^^^^^^ sed 's /.\+/ `` /' sed ': a; N; $! ba; s / \ n /, / g' | sed 's /^.\+/ TABEL DROP DACĂ EXISTĂ ; / ' mysql -u UTILIZATOR - Baza de date PAS

Notă. Caracterul _ (subliniere) din instrucțiunea LIKE este special și înseamnă un caracter, astfel că \ (backslash) este evadat. În unele cochilii Linux, backslash-ul poate fi de asemenea interpretat într-un mod special și necesită un al doilea \ înainte de acesta. Luați în considerare acest lucru și verificați ce ecou trimite la mysql.







Trimiteți-le prietenilor: