Zadejte hledaný výraz...

Zachování správné pozice v tabulce

Stejky
verified
rating uzivatele
(1 hodnocení)
29. 6. 2012 17:20:41
Dobrý den, mám tabulka např test a v sloupce id a position. Ukázka:
insert into test (position) values (0)(1)(2)(3)(4);
Chci zajistit, že když smažu záznám, kde je position např. 2, tak aby se position dalších záznamu změnilo a nebylo 0,1,3,4 protože další vložený záznam by se mi uložil jako 4 (tak to mám naimplementováno u klienta, ale o tom nic).
Chci to realizovat takhle. Vytvořit trigger after delete. V triggeru si uložím hodnotu old.position a následně vyberu všechny záznamy z tabulky test, které mají hodnotu větší než old.position a všechny tyto vybrané záznamy projet a přidělit jim hodnotu position + 1. Snad chápete čeho chci docílit. Neumím to akorát napsat v mysql, tak bych poprosil o radu. Děkuji
---------- Příspěvek doplněn 30.06.2012 v 01:11 ----------
Tak jsem to vyřešil takto, ale není to vůbec šťastné řešení. Trigger nemůže updatovat nad tabulkou, nad kterou je vytvořen, takže je nutno to překopírovat např do temporary table a pak z ní zpátky. Kdyby měl někdo lepší řešení, tak bych byl rád. Mé řešení:
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE poziceId, pozicePosition INT;
DECLARE cur1 CURSOR FOR SELECT `pozice`.`id`,`pozice`.`position` FROM pozice;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO poziceId, pozicePosition;
IF done THEN
LEAVE read_loop;
END IF;
IF pozicePosition > old.`position` THEN
INSERT INTO temp(`id`,`position`) VALUES (poziceId,pozicePosition-1);
END IF;
IF pozicePosition < old.`position` THEN
INSERT INTO temp(`id`,`position`) VALUES (poziceId,pozicePosition);
END IF;
END LOOP;
CLOSE cur1;
END
29. 6. 2012 17:20:41
https://webtrh.cz/diskuse/zachovani-spravne-pozice-v-tabulce#reply779982
duben
verified
rating uzivatele
(49 hodnocení)
6. 7. 2012 09:19:59
Osobně naprosto nechápu důvod toho co děláš. Proč je problém mít ve vzestupné číslené řadě IDček díru.
To co děláš nejen že brutálně zatíží databázi jakmile trochu naroste (dovedeš si představit, že máš 1 milion záznamů a smažes ID = 1?, to pak budeš updatovat milion záznamů ... ufff), navíc pokud nemáš opravdu dobře ošetřenou datovou integritu, tak po každé změně musíš uhlídat všechny navázané tabulky a ty taky aktualizovat, jinak ti dojde k přeházení dat a už to nikdy nepůjde opravit, max. ručně (a takhle provázanou datovou integritu při updatu, to mojí připomínku o zátěži databáze násob exponenciálně, tohle položí server docela bezpečně jakmile bude větší počet provázaných záznamů, nehledě na v tomto případě téměř 100 procentní jistotu deadlocku, nebo zamčených záznamů pro čtení).
Pokud z nějakého důvodu potřebuješ mít pro záznamy pořadí 1,2,3 ... X, tak se to rozhodně nedělá přečíslováním IDček.
6. 7. 2012 09:19:59
https://webtrh.cz/diskuse/zachovani-spravne-pozice-v-tabulce#reply779981
Pro odpověď se přihlašte.
Přihlásit