Autor Zpráva
radekt
Profil
Dobrý den,
mám dvě tabulky:
mesta (id, nazev, zeme_id - klíč určující, v které zemi město leží)
zeme (id - na něj se odkazuje pole zeme_id z tabulky mesta, nazev)

Zadám-li nové město do tabulky města, chci pak nejpozději zadanému městu (tedy s nejvyšším id) zadat zemi:

update mesta set zeme_id = (select id from zeme where nazev='Turecko') where id in (select max(id) from mesta);

Ale vrátí mi to tuto chybu: You can't specify target table 'mesta' for update in FROM clause

Co dělám špatně?
Tori
Profil
Nedá se vybírat ze stejné tabulky, již updatujete, zkoušela jsem použít alias, ale ani to nepomohlo.
* Když je to nejvyšší ID, můžete použít tohle:
update mesta set zeme_id = (select id from zeme where nazev='Turecko') order by mesta.id desc limit 1
* anebo si po vložení města zjistit přidělené ID a použít to (mysql_insert_id())
* anebo vkládat město zároveň s údajem o zemi, pokud v době ukládání města už víte, k jaké zemi patří (INSERT ... SELECT)
radekt
Profil
Protože to chci dělat čistě v mySQL, nemohu použít php funkci. Nakonec jsem to vyřešil tak, že jsem si tabulku mesta zkopíroval do dočasné tabulky, a z té si vybral nejvyšší id
update mesta set zeme_id = (select id from zeme where nazev='Turecko') where id in (select max(id) from tmp_mesta);
dočasnou tabulku pak smazal a hotovo.
Kajman
Profil
radekt:
Co se vám v řešení s order by nezdá čistého v rámci mysql?

Jinak při updatování tabulky a čtení z té samé je možné díky syntaxi pro multiple-table update (spojíte si výsledek dotazu do tabulku s tou samou tabulkou).
LaMMa
Profil
tu to mas ciste v mySQL bez zbytocneho kopirovania tabulky (aj ked s order by si to mal jednoduchsie)...
ak pouzivas innodb:
START TRANSACTION;
SELECT @myvar := MAX(id) FROM mesta;
UPDATE mesta SET zeme_id = (SELECT id FROM zeme WHERE nazev='Turecko') WHERE id = @myvar;
COMMIT;

ak pouzivas myisam:
LOCK TABLES mesta WRITE;
SELECT @myvar := MAX(id) FROM mesta;
UPDATE mesta SET zeme_id = (SELECT id FROM zeme WHERE nazev='Turecko') WHERE id = @myvar;
UNLOCK TABLES;
radekt
Profil
Geniální idea! Děkuji. Používám MyISAM - teď jsem to aplikoval a funguje k plné spokojenosti.

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: