Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySql] trigger zmniejszający id po usunieciu
tomm
post
Post #1





Grupa: Zarejestrowani
Postów: 142
Pomógł: 28
Dołączył: 7.04.2008

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Yyy, tak offtopiciem nieco - w jakim celu chcesz zmniejszać ID...? Po czym się potem odwołasz do rekordów?
Go to the top of the page
+Quote Post
tomm
post
Post #3





Grupa: Zarejestrowani
Postów: 142
Pomógł: 28
Dołączył: 7.04.2008

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
kantek
post
Post #4





Grupa: Zarejestrowani
Postów: 73
Pomógł: 15
Dołączył: 2.04.2009
Skąd: koszalin

Ostrzeżenie: (0%)
-----


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

Ten post edytował kantek 19.05.2009, 18:40:40
Go to the top of the page
+Quote Post
tomm
post
Post #5





Grupa: Zarejestrowani
Postów: 142
Pomógł: 28
Dołączył: 7.04.2008

Ostrzeżenie: (0%)
-----


oczywiście jest to rozwiązanie ale :
- po pierwsze chcialem potrenowac tworzenie triggerow (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
- po drugie wiąże sie to z wysłaniem dwóch zapytań.
Go to the top of the page
+Quote Post
nieraczek
post
Post #6





Grupa: Zarejestrowani
Postów: 405
Pomógł: 6
Dołączył: 12.01.2007

Ostrzeżenie: (0%)
-----


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;


Ten post edytował nieraczek 19.05.2009, 19:21:02
Go to the top of the page
+Quote Post
tomm
post
Post #7





Grupa: Zarejestrowani
Postów: 142
Pomógł: 28
Dołączył: 7.04.2008

Ostrzeżenie: (0%)
-----


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"
Go to the top of the page
+Quote Post
nieraczek
post
Post #8





Grupa: Zarejestrowani
Postów: 405
Pomógł: 6
Dołączył: 12.01.2007

Ostrzeżenie: (0%)
-----


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.

Ten post edytował nieraczek 19.05.2009, 19:54:44
Go to the top of the page
+Quote Post
Crozin
post
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
slimboj
post
Post #10





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 6.01.2008

Ostrzeżenie: (0%)
-----


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ć (IMG:http://forum.php.pl/style_emoticons/default/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

Ten post edytował slimboj 21.05.2009, 09:40:40
Go to the top of the page
+Quote Post
phpion
post
Post #11





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Ż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.
Go to the top of the page
+Quote Post
slimboj
post
Post #12





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 6.01.2008

Ostrzeżenie: (0%)
-----


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ć?

Ten post edytował slimboj 22.05.2009, 11:26:22
Go to the top of the page
+Quote Post
erix
post
Post #13





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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

Poszukaj w tym dziale mojej odpowiedzi do podobnego tematu. (IMG:http://forum.php.pl/style_emoticons/default/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...?
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 08:37