Autor | Zpráva | ||
---|---|---|---|
radekt Profil |
#1 · Zasláno: 19. 6. 2012, 09:12:54
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 |
#2 · Zasláno: 19. 6. 2012, 09:36:23
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 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) |
||
Časová prodleva: 3 dny
|
|||
radekt Profil |
#3 · Zasláno: 22. 6. 2012, 10:13:21
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); |
||
Kajman Profil |
#4 · Zasláno: 22. 6. 2012, 10:53:39
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 |
#6 · Zasláno: 22. 6. 2012, 19:57:07
Geniální idea! Děkuji. Používám MyISAM - teď jsem to aplikoval a funguje k plné spokojenosti.
|
||
Časová prodleva: 11 let
|
0