CREATE TABLE navigation ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, parent_id INT(10) UNSIGNED NOT NULL DEFAULT 0, depth TINYINT(3) UNSIGNED NOT NULL DEFAULT 0, tree VARCHAR(255) NULL, type ENUM('page','messages','blog') NOT NULL, is_locked ENUM('0','1') NOT NULL DEFAULT 0, PRIMARY KEY(id) ) TYPE=InnoDB; CREATE TABLE navigation_translate ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, navigation_id INT(10) UNSIGNED NOT NULL, LANGUAGE CHAR(2) NOT NULL, name VARCHAR(45) NOT NULL, guid VARCHAR(45) NOT NULL, pattern VARCHAR(255) NULL, is_visible ENUM('0','1') NOT NULL DEFAULT 1, position INT(10) UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY(id), INDEX navigation_translate_FKIndex1(navigation_id), FOREIGN KEY(navigation_id) REFERENCES navigation(id) ON DELETE CASCADE ON UPDATE CASCADE ) TYPE=InnoDB;
Zrzut danych (przykładowych):
INSERT INTO navigation (id, parent_id, depth, tree, type, is_locked) VALUES (1, 0, 0, '0', 'messages', '0'), (2, 1, 1, '0.1', 'messages', '0'), (3, 2, 2, '0.1.2', 'messages', '0'), (4, 3, 3, '0.1.2.3', 'messages', '0'), (5, 3, 3, '0.1.2.3', 'messages', '0'), (6, 0, 0, '0', 'messages', '0'), (7, 6, 1, '0.6', 'messages', '0'); -- -- Zrzut danych tabeli 'navigation_translate' -- INSERT INTO navigation_translate (id, navigation_id, LANGUAGE, name, guid, pattern, is_visible, position) VALUES (66, 1, 'pl', 'Wiadomości', 'wiadomosci', 'wiadomosci', '0', 0), (67, 1, 'en', 'Messages', 'messages', 'messages', '0', 0), (68, 2, 'pl', 'Polska', 'polska', 'wiadomosci/polska', '0', 0), (69, 2, 'en', 'Polska', 'polska', 'messages/polska', '0', 0), (70, 3, 'pl', 'Lubelskie', 'lubelskie', 'wiadomosci/polska/lubelskie', '0', 0), (71, 3, 'en', 'Lubelskie', 'lubelskie', 'messages/polska/lubelskie', '0', 0), (72, 4, 'pl', 'Lublin', 'lublin', 'wiadomosci/polska/lubelskie/lublin', '0', 0), (73, 4, 'en', 'Lublin', 'lublin', 'messages/polska/lubelskie/lublin', '0', 0), (74, 5, 'pl', 'Lubartów', 'lubartow', 'wiadomosci/polska/lubelskie/lubartow', '0', 0), (75, 5, 'en', 'Lubartów', 'lubartow', 'messages/polska/lubelskie/lubartow', '0', 0), (76, 6, 'pl', 'Informacje', 'informacje', 'informacje', '0', 0), (77, 6, 'en', 'Information', 'information', 'information', '0', 0), (78, 7, 'pl', 'Z kraju', 'z-kraju', 'informacje/z-kraju', '0', 0), (79, 7, 'en', 'Form country', 'form-country', 'information/form-country', '0', 0);
Zapytanie:
UPDATE navigation AS na, navigation_translate AS nt INNER JOIN navigation_translate AS ntc ON (ntc.navigation_id = 2 AND ntc.LANGUAGE = nt.LANGUAGE) INNER JOIN navigation_translate AS ntp ON (ntp.navigation_id = 7 AND ntp.LANGUAGE = nt.LANGUAGE) INNER JOIN navigation AS nac ON (nac.id = 2) INNER JOIN navigation AS nap ON (nap.id = 7) SET nt.pattern = CONCAT(ntp.pattern, '/', ntc.guid, SUBSTRING(nt.pattern, CHAR_LENGTH(ntc.pattern)+1)), na.tree = CONCAT(nap.tree, '.', nap.id, SUBSTRING(na.tree, CHAR_LENGTH(nac.tree)+1)), na.depth = IF((nac.depth > nap.depth), (na.depth-((nac.depth-nap.depth)-1)), (na.depth+((nac.depth-nap.depth)+1))) WHERE na.tree LIKE '0.1%' AND nt.navigation_id = na.id
Problem polega na tym że raz to zapytanie UPDATE działa dobrze a raz źle. Przy tych samych danych (czyściłem tabele, wrzucałem dane) raz działało okej a raz źle.
Navigation to tabela z kategoriami a navigation_translate to tłumaczenia tej kategorii na różne języki.
Zapytanie UPDATE polega na zmianie gałęzi (kategorii nadrzędnej) danego elementu, a co za tym idzie wywołuje szereg zmian na przenoszonych rekordach. Zmiana tree którym są id kolejno nadrzędnych elementów danego elementu, oraz zmiana sciezki. sciezka to kolejno guidy rozdzielone separatorem "/"
Problem polega na tym że SET wstawia jakieś niedorzeczne rzeczy a nawet wstawia rzeczy które "kiedyś istniały w bazie" ale w tej chwili nie istnieją.
sprawdzałem u siebie na localhoście i na nazwa.pl i błąd zdarza się zarówno tu i tu.
Może ktoś ma większe doświadczenie w tego typu UPDATE (złożonych) i może się podzielić informacjami? Może coś źle robię?
Przykładowo po wykonaniu tego zapytania: kolumna tree dla jednego rekordu wyglądała tak: "0.6.7pierwsza/drugafirstpierwszapierwsza", mimo że w SET na.tree nic takiego nie miało prawa się stać....
EDIT: Dałem radę. Trzeba rozdzielić to na 3 zapytania. I trochę poprzerabiać. Do usunięcia