Tömeges törlés a mysql táblákon egy prefixen, direqtor

Különböző CMS-kkel történő munkavégzéskor gyakran szükséges törölni nagyszámú táblát egyszerre egyetlen előtaggal a MySQL adatbázisban. Különösen abban az esetben, ha egy adatbázist több rendszer használja saját előtagjaikkal.







Itt fogok elhagyni magam és a látogatók számára néhány lehetőséget

Ez a módszer a hálózaton található különböző erőforrásokra vonatkozik. A lekérdezést az előtag helyettesítésével kell végrehajtania. amely visszaadja a táblák törléséhez szükséges új kérés szövegét:

SELECT GROUP_CONCAT # 40; "DROP TABLE". tábla_neve. ';' SEPARATOR " # 41; AS nyilatkozat
FROM information_schema. asztalok
WHERE táblázatnév LIKE "előtag \ _%";

A következtetést szemmel kell ellenőrizni. A GROUP_CONCAT csonkolja azt a group_concat_max_len (az alapértelmezett érték 1024) változó hosszúsága mentén. Ezért már 20-25 táblával hibás kérést kap.

Ezt a következőképpen veheti figyelembe:

SET SESSION group_concat_max_len = 1000000;
SELECT GROUP_CONCAT # 40; "DROP TABLE". tábla_neve. ';' SEPARATOR " # 41; AS nyilatkozat
FROM information_schema. asztalok
WHERE táblázatnév LIKE "előtag \ _%";

Az így kapott kimenet olyan kérés, amely törli a szükséges táblázatokat, amelyeket a MySQL-ben bármilyen módon végre kell hajtani. Ez a módszer a legegyszerűbb egy webes felület (például phpMyAdmin) vagy ablak ügyfelek (például MySQL Workbench) használatához.

A kérés kimenete azonban hosszabb, mint max_allowed_packet (alapértelmezett 4Gb), és nem fog működni. Szerintem négy gigabájt elegendő mindenki számára. )

Csak podrihtoval eredeti változat tetszik.

SELECT CONCAT # 40; "DROP TABLE IF EXISTS` '. GROUP_CONCAT # 40; tábla_neve. ',' SEPARATOR '' # 41;. ''; ' # 41; AS nyilatkozat
FROM information_schema. asztalok
WHERE táblázatnév LIKE "előtag \ _%";








A verzió előnyei egyértelműek:

  • a szerver egy kérelmet kap, és nem veszi fel a több száz DROP csomagot, mert gyorsabban dolgozik;
  • a kód kétszer rövidebb, 1024 karakteres határon belül, kétszer annyi táblát fog illeszteni;
  • a kód nem fog hibát okozni, ha a húr hossza meghaladja a group_concat_max_len értéket;
  • ha a korlátokat túllépték, akkor az első lekérdezés után egyszerűen új lekérdezést generálhat, mivel a benne foglalt táblák már törlődnek, a fennmaradóak lesznek helyükben;
  • a táblák nevét védett idézőjelekkel "` az SQL kulcsszavakkal rendelkező táblanevek egybeesése esetén;

A módszer alkalmas a webes felületet (például a phpMyAdmin) vagy az ablak-ügyfeleket (pl. MySQL Workbench) használó felhasználók számára.

Lehetőség a BASH számára

Nincsenek korlátozások. Egy egyszerű táblázatot a bash-tolmács parancssorában (CLI) jelenít meg. A DROP TABLE lekérdezést a shell parancsok generálják, és a mysql ügyfélprogram újra végrehajtja.

echo "megjelenítési táblázatok, mint a" PREFIX \ _% '"| \ # Lekérdezünk egy táblázatot. Cserélje ki a PREFIX \ _ -ot a kívánt gombbal.
mysql -N -u USER -PASS ADATBÁZIS | \ # A kérés küldése a MySQL-nek. Az -N opció csonkolja az oszlopfejléc kimenetét.
sed '/^.\+$/!d' | \ # Az üres sorok törlése csak abban az esetben.
sed 's /.\ +/ `` /' | \ # A táblák neveinek megnevezése a `` védelmi idézőjelben.
sed ': a; N; $! ba; s / \ n /, / g' | \ # Ez a sed-o-boszorkány egy vesszővel ragasztja az összes sort.
sed /^.\+/ DROP TABLE IF EXISTS ; / '| \ # Hozzáadjuk az SQL lekérdezést.
mysql -u USER -pPASS DATABASE # Küldje el a kérelmet MySQL-nek a végrehajtáshoz.
# A 3. és a 7. sorban adja meg a kapcsolat paramétereit az adatbázisba.
# USER a MySQL felhasználói neve.
# A PASS a felhasználó jelszava (nincs szükség a p-és PASS közötti helyre). A -p-opciót csak üresen hagyhatja, és kétszer beírhatja a jelszót.
# DATABASE az az adatbázis neve, amelyen dolgozik.


A bash parancs törli a táblákat egy sorban.

echo "megjelenítési táblázatok, mint a" PREFIX \ _% '"| mysql -N -u USER -PASS ADATBÁZIS | sed '/^.\+$/!d' | sed 's /.\ +/ `` /' | sed ': a; N; $! ba; s / \ n /, / g' | sed /^.\+/ DROP TABLE IF EXISTS ; / '| mysql -u USER -PASS ADATBÁZIS

Megjegyzés. A LIKE utasítás _ (aláhúzás) karaktere különleges, és minden karaktert jelent, így a \ (backslash) escape. Néhány Linux-héjban a backslash speciális módon értelmezhető, és előtte egy második \ szükséges. Vegye figyelembe ezt, és ellenőrizze, hogy a visszhang a mysql-nek elküldi-e.