Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySql] trigger zmniejszający id po usunieciu
Forum PHP.pl > Forum > Bazy danych > MySQL
tomm
Witam
Chciałbym po usunieciu z tabeli jakiegoś rekordu zmniejszy o 1 id rekordów których wartośc jest większa niz tego usnietego czyli: usuwam rekord z id 5 to w rekordzie 6 id zmienia się na 5, w 7 na 6 ....
Próbuję to zrobic za pomoca triggera
  1. CREATE TRIGGER zmniejsz_lp
  2. AFTER DELETE ON Potencjalni
  3. FOR EACH ROW
  4. BEGIN IF id_pot > OLD.id_pot
  5. THEN SET id_pot = id_pot - 1;
  6. END IF;
  7. END;

Mysql wyrzuca 'Unknow system variable "id_pot"'. Oczywiście istnieje pole o nazwie 'id_pot' w tabeli Potencjalni.
erix
Yyy, tak offtopiciem nieco - w jakim celu chcesz zmniejszać ID...? Po czym się potem odwołasz do rekordów?
tomm
To jest tabela która nie ma relacji, nie jest łączona z danymi z innych tabel. Poprostu chcę aby kolejnośc numerowania była ciągła.
kantek
Nie wiem jak to zrobic na trigerze:0, ale w zwyklym zapytaniu dałbym to:

(zakładam że znasz to id tu dam przykład z 5) - daj swoje nazwy tabeli i pól

  1. UPDATE kategorie SET category_id=category_id-1 WHERE category_id>5


Pozdrawiam
tomm
oczywiście jest to rozwiązanie ale :
- po pierwsze chcialem potrenowac tworzenie triggerow smile.gif
- po drugie wiąże sie to z wysłaniem dwóch zapytań.
nieraczek
No przecież kantek Ci napisał co zrobic, nie wiem jak w MySQL, bo pisałem triggery w innym SZRBD, ale to powinno byc cos w stylu:

  1. CREATE TRIGGER wyzwalacz
  2. after DELETE ON Potencjalni
  3. referencing old AS stary
  4. FOR each row
  5.  
  6. begin UPDATE kategorie SET category_id=category_id-1 WHERE category_id>stary.category_id
  7.  
  8. end;
tomm
Przecież w pierwszym poście napisalem własnie MySql-ową wersję tego co napisaleś czyli dla każdego wiersza w którym id jest większe od id usunietego wiersza ustaw id = id - 1
Chodzi mi o to dlaczego wyrzuca ten komunikat o zmiennej "id_pot"
nieraczek
A gdzie masz zdefiniowana zmienna id_pot ? Poza tym NIE WOLNO nazywac zmiennych tak samo jak nazwy kolumn tabel w bazie danych, bo moga wyjsc na prawde dziwne rzeczy.
Crozin
Cytat
Poprostu chcę aby kolejnośc numerowania była ciągła.
A mógłbys powiedzieć w jakim celu ma być ona ciągła?
slimboj
Witam,
Ostatnio pisałem skrypt zarządzający użytkownikami i spotkałem się z podobnym problemem. Tzn. bardziej mnie zastanawia, która opcja będzie lepsza/efektywniejsza:
1. Po usunięciu danego rekordu z tabeli (przykładowo jakiegoś usera) zmieniać id pozostałych rekordów, aby właśnie zachować ciągłość.
2. Usunąć rekord i zapomnieć smile.gif (następny nowy dodawany user będzie miał pierwsze wolne ID, ale nie wiem czy jest to bezpieczne).
3. Usunąć dane z rekordu zostawiając w tabeli jedynie ID.

Jak wy rozwiązujecie ten problem?
Z góry dzięki za odpowiedź.

Pozdrawiam,
Max
phpion
Żadne z powyższych. Usunąć rekord i o nim zapomnieć ale następny użytkownik nie dostanie pierwszego wolnego id tylko to, które jest następne. Przykładowo: masz użytkowników o id 1, 2, 3. Usuwasz tego z 2 czyli pozostaje 1, 3. Rejestruje się nowy użytkownik i otrzymuje on id = 4, a nie 2.
slimboj
Ok, napisałem to tak i działa:

  1. <?
  2. $MaxId = mysql_query("SELECT MAX(user_id) FROM ".$tb_prefix."users");
  3. $Add = mysql_query("INSERT INTO ".$tb_prefix."users VALUES (".$MaxId."+1, value1, value2, value3)");
  4. ?>


Ale jeśli napiszę tak to już nie chce:
  1. <?
  2. $Add = mysql_query("INSERT INTO ".$tb_prefix."users VALUES ((SELECT MAX(user_id) FROM ".$tb_prefix."users)+1, value1, value2, value3)");
  3. ?>


Może ktoś podpoiwedzieć, gdzie jest błąd? Albo jak inaczej/efektywniej to napisać?
erix
Cytat
Może ktoś podpoiwedzieć, gdzie jest błąd? Albo jak inaczej/efektywniej to napisać?

Poszukaj w tym dziale mojej odpowiedzi do podobnego tematu. winksmiley.jpg

Najpierw deklarujesz zmienną z wartością maksymalną, potem używasz jej w insert.

A jeśli chodzi o ten drugi listing - czemu piszesz auto_increment od nowa...?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.