Autor Zpráva
snazimse
Profil
Zdravím,

prosím všechny, mám takovou otázku a nemůžu příjít jak spustit tyto příkazy, doporučené jedním člověkem v dokumentaci starého MYSQL.
Nedává mi to smysl. Budu opravdu rád, za pomoc jak na to.

odkaz zde: https://dev.mysql.com/doc/refman/5.0/en/drop-database.html#c10178

Je to komentář Jonathan Watt.

Jedná se o kód, co tam uvádí na DROP TABLE s cizími klíčemi.

MYSQL="mysql -h HOST -u USERNAME -pPASSWORD -D DB_NAME"
$MYSQL -BNe "show tables" | awk '{print "set foreign_key_checks=0; drop table `" $1 "`;"}' | $MYSQL
unset MYSQL

Nevím, kde a jak to mám spustit tohle, přijde mi to jako příkaz do shellu, nebo na to je ještě speciální program nějaký, něco jako MYSQL MONITOR? Nicméně tohle by mohlo fungovat v shellu, bez MYSQL, nevím, jestli to tam uvádí, jen tak,pak je to blbost si myslím.

mysql -h HOST -u USERNAME -pPASSWORD -D DB_NAME

Ale tohle, jak to tam mám dát, proč před každý příkaz, dává MYSQL tady ještě + dolar, to je dovolená syntaxe, nebo jak to je? A na konci unset, tak je to asi součást konstrukce. Jedině mě napadá, že to je rozdělené v tom ty příkazy, ale nevím.

$MYSQL -BNe "show tables" | awk '{print "set foreign_key_checks=0; drop table `" $1 "`;"}' | $MYSQL
unset MYSQL

Děkuji všem moc předem za pomoc, objasnění a vysvětlení !
xROAL
Profil
MYSQL="mysql -h HOST -u USERNAME -p PASSWORD -D DB_NAME" bude deklarácia premennej.

Do ďalšieho riadku sa vypíše obsah tejto premennej, teda pripojenie k DB a do nej sa odošle príkaz SHOW TABLES;. Výsledok tohoto príkazu sa odovzdá funkcii awk, ktorá pre jednotlivé názvy tabuliek vygeneruje príkazy SET FOREIGN_KEY_CHECKS=0; DROP TABLE `nazovTabulky`;. Tieto príkazy sa zase predajú do toho posledného $MYSQL, čím sa znovu vytvorí pripojenie k DB a vykonajú sa.

unset MYSQL už hovorí viac menej za seba, proste sa predtým deklarovaná premenná zruší.

Ak chceš to isté spraviť napr. z PHP, tak ti stačí jednoducho do DB poslať tie dva príkazy:
SET FOREIGN_KEY_CHECKS=0;
DROP TABLE `nazovTabulky`;

Moje vedomosti s Linuxom sú celkom slabé, snáď som pri vysvetľovaní toho scriptu nespravil žiadnu vážnejšiu chybu.
juriad
Profil
Jde o to, že shell je textově orientovaný jazyk. Tedy on najde $MYSQL a to nahradí za definici této proměnné. A pokračuje dále. Až se postará o všechny proměnné, vyjde mu příkaz:
mysql -h HOST -u USERNAME -pPASSWORD -D DB_NAME -BNe "show tables" | awk '{print "set foreign_key_checks=0; drop table `" $1 "`;"}' | mysql -h HOST -u USERNAME -pPASSWORD -D DB_NAME
Ten napřed spustí v MySQL dotaz na show tables (to vrátí na každém řádku název jedné tabulky). To dostane na vstup awk, které pro jednotlivé řádky vygeneruje příkaz: set foreign_key_checks=0; drop table `názevTabulky`;, kde názevTabulky je převzatý z dotazu na show tables. A následně je sekvence těchto dotazů (pro každou tabulku jeden) poslána programu mysql, který je provede.
Ta proměnná na začátku (a unset na konci) vlastně není nutná, jen umožňuje nastavení údajů na jediném místě.

Máš nějaký důvod dropovat všechny tabulky, ale nedropnout celou databázi? Databázi pak můžeš snadno znovu vytvořit.
snazimse
Profil
xROAL, juriad:

Děkuji za vysvětlení fakt perfektní moc děkuji, takže to spouští shellem všechno.

A shell a jeho mysql program to má automaticky, nebo je to součást localhostu (ten program)?

Ta proměnná na začátku (a unset na konci) vlastně není nutná, jen umožňuje nastavení údajů na jediném místě.

Ano, chápu tak, že bych nemusel vytvářet, proměnnou a mohl to napraskat, dohromady.

Máš nějaký důvod dropovat všechny tabulky, ale nedropnout celou databázi? Databázi pak můžeš snadno znovu vytvořit.

Ne tam šlo jen o omezenější práva, když nemá někdo na sdíleném hostingu a nemůže si je nastavit, pak se to má takto provést. O tom tam mluví ten člověk, právě.Nebo, že to kdysi mysql nepodporovalo, nebo takhle, nevím každopádně to psal v roce 2009. Takže netuším měl jsem,vale někde takhle starou databázi, tak mě to zajímalo.
juriad
Profil
Na toto já používám tento dotaz:
SELECT concat('DROP TABLE IF EXISTS ', table_name, ';') FROM information_schema.tables WHERE table_schema = 'test';
Název databáze si změň na svůj.
Výsledkem je hromada řádků, které zkopíruješ a spustíš jako nový dotaz.

Pokud databáze obsahuje cizí klíče, spusť ještě SET FOREIGN_KEY_CHECKS = 0 pro zrušení jejich kontroly.
snazimse
Profil
juriad:

To vypadá dobře!

Výsledkem je hromada řádků, které zkopíruješ a spustíš jako nový dotaz.

Výsledkem toho dotazu, když tam je dané table_name? A table_schema s přesnou hodnotou, to by mělo vrátit jen jeden výsledek, ne?
juriad
Profil
Výsledkem je hromada řádků, například:
DROP TABLE IF EXISTS tabulka1;
DROP TABLE IF EXISTS tabulka2;
DROP TABLE IF EXISTS tabulka3;
atd.
To pak zkopíruješ a spustíš.

Ta podmínka WHERE se týká jen schématu (databáze) nikoli názvů tabulek - ty nás konec konců zajímají.
snazimse
Profil
juriad:

Ok, dobře díky moc!

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: