Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [trigger] rekurencja - usuwanie, wyzwalacz, usuwający obiekty podrzedne
jastu
post
Post #1





Grupa: Zarejestrowani
Postów: 382
Pomógł: 0
Dołączył: 29.11.2005
Skąd: :jestem();

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


Witam,
Struktura w tabeili wygląda tak (tree) (mssql 2005)
  1. id   |   parent_id    |   name
  2. ----------------------------
  3. 1    |  0               | Nazwa_1
  4. 2    |  1               | Nazwa_2
  5. 3    |  1               | Nazwa_3
  6. 4    |  2               | Nazwa_4


jak ładnie usunąć rekokrd o id = 1, tak by zostały usunięte rekordy podrzedne w strukturze ? Wstawianie do tabeli ograniczyłem wyzwalaczem, który sprawdza zagłębienie w strukturze, i wstawia rekord na max n+2 (lub zwraca błąd).
Można to zgrabnie zrobić ?
Go to the top of the page
+Quote Post
Gomes
post
Post #2





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 22.06.2008

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


Przy tworzeniu tabeli trzeba pamiętać, żeby zadeklarować klucz obcy:

  1. CREATE TABLE nazwa_tabeli
  2. (
  3. id INTEGET AUTO_INCREMENT PRIMARY KEY,
  4. name VARCHAR(50) NOT NULL,
  5. parent_id INTEGER,
  6. FOREGIN KEY (parent_id) REFERENCES druga_tabela(parent_id) ON DELETE CASCADE
  7. ) ENGINE = InnoDB;


Tabele muszą być obsługiwane przez mechanizm InnoDB!!!
Go to the top of the page
+Quote Post
jastu
post
Post #3





Grupa: Zarejestrowani
Postów: 382
Pomógł: 0
Dołączył: 29.11.2005
Skąd: :jestem();

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


Oracuję na MSSQL 2005, do tego ma to być jedna tabela, która odwzoruje całą strukturę
Go to the top of the page
+Quote Post
john_doe
post
Post #4





Grupa: Zarejestrowani
Postów: 873
Pomógł: 25
Dołączył: 24.07.2005

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


nie wiem czy dobrze rozumiem o co Ci chodzi. Mam brać pod uwagę tylko tabelę która przedstawiłeś? Jeśli tak to musisz napisać procedure a potem np wpakować ja w wyzwalacz.

  1. SET QUOTED_IDENTIFIER ON GO
  2. SET ANSI_NULLS ON GO
  3.  
  4.  
  5. CREATE procedure deleteRecords ( @p_id int )
  6. AS declare @ajdi int;
  7.  
  8. SELECT @ajdi = id FROM twojaTabela WHERE id = @p_id;
  9.  
  10. IF @ajdi IS NOT NULL
  11. begin DELETE FROM twojaTabela WHERE id = @ajdi;
  12. DELETE FROM twojaTabela WHERE parenent_id = @ajdi;
  13.  
  14. end;
  15.  
  16.  
  17. GO
  18. SET QUOTED_IDENTIFIER OFF
  19. GO
  20. SET ANSI_NULLS ON GO


parrenty trzymasz w innej tabeli wiec latwo to dodac do precedury, lub wyzwalacz ktory sprawdza powiazanie. O to chodzi. Jeśli nie napisz to się pomyśli.

pozdro Krystian

Ten post edytował john_doe 6.07.2008, 22:26:54
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: 2.10.2025 - 21:33