Autor Zpráva
ondra256
Profil
Zdravím,

potřebuju pomoct se sestavením následujícího, který maže všechna data ve vybraných tabulkách:

Když sestavím dotaz na 2 tabulky tak funguje
DELETE FROM attribute, attribute_combination USING attribute, attribute_combination

Když, ale sestavím dotaz na cca 150 tabulek, které v databázi jsou (vypadá uplně stejně jen je tam víc tabulek), tak se provede, žádná chyba nevyskočí, ale nesmaže se nikde nic.

Zkoušel jsem před deletem vypínat kontrolu cizích klíčů, ale nijak to nepomohlo (stejně bych očekával že dostanu chybu). Nesetkal se s tím někdo?
juriad
Profil
ondra256:
Proveď 150 dotazů. A můžeš provést TRUNCATE TABLE, který by měl být výkonnější.
Jsi si jistý, že kod pro výmaz všeho chceš psát v PHP? Není lepší DROPnout celou databázi a vytvořit ji znovu?

Pokud tu syntaxi chápu správně, provádíš kartézský součin tabulek attribute a attribute_combination. Něco jako:
SELECT * FROM attribute, attribute_combination
A pak smažeš každý záznam, který se kdy dostal do výsledku. Tím kartézkým součinem ti databáze exploduje. Naštěstí je tam omezení, které by se mělo projevit i zde: dev.mysql.com/doc/refman/5.7/en/joins-limits.html
ondra256
Profil
O PHP jsem nenapsal ani slovo. Mám na to MySQL proceduru.
Databázi dropnout nelze, protože nemám oprávnění, mám to na obyčejném hostingu, nemám VPS.
Ten kartézský součin mně nenapadl, to máš asi pravdu, špatně jsem ten multi-delete pochopil, budu muset bohužel posílat 150 dotazů.

O TRUNCATE vím, ale když jsem na své databázi srovnával TRUNCATE a DELETE tak paradoxně byl DELETE rychlejší. Rozhodl jsem se teda pro DELETE s tím, že DELETE má možnost použití parametru QUICK, ale ten jsem ještě netestoval.

Otestuju ještě všechny možnosti a uvidím. Dík moc
TomášK
Profil
Přijde mi divné, že jsou ty samé tabulky ve FROM i v USING. Nestačí je dát do FROM? Nezmění se něco? Tak jako tak, 150 dotazů bude lepší než jeden obrovský. Zvlášť v proceduře.

juriad
Ohledně TRUNCATE, změřil bych si, jestli je opravdu rychlejší, teď jsem někde četl opak kev.inburke.com/kevin/a-two-month-debugging-story (PostgreSQL)

TRUNCATE TABLE table1 table2 table3 table4 CASCADE
200ms

ALTER TABLE tableA DISABLE TRIGGER ALL;
DELETE FROM tableA;
ALTER TABLE tableA ENABLE TRIGGER ALL;
20ms

BEGIN; SET CONSTRAINTS ALL DEFERRED;
DELETE FROM tableA;
DELETE FROM tableB;
COMMIT
10ms

A co s tím může být za problémy je v článku, ale zřejmě jen v PostgreSQL.
ondra256
Profil
Když je nepoužiju v USING tak vyskočí ERROR
Keeehi
Profil
Rozdíl mezi TRUNCATE a DELETE je ještě v tom, že TRUNCATE resetuje autoincrement u sloupců.
TomášK
Profil
ondra256
Máš pravdu, špatně jsem pochopil dokumentaci.

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: