webForumDet fria alternativet

Hur radera poster, relaterade till andra poster?

Databaser & SQL

12 svar · 484 visningar · startad av Palle

Medlem sedan apr. 20003 174 inlägg
Frågan#1

Hej,

Har stött på patrull när jag ska försöka radera poster från databasen (mySQL),
jag vet inte riktigt hur jag ska göra för att göra det riktigt smidigt. ;)

Jag har en dynamiskt tree-navigation, som på sidan kan se ut så här, ex.

[blue]+ Bilar
-- Kombi-modeller
-- + V40
-- + V50
-- + V70
--- + Interiör
--- + Exteriör
-- Sedan-modeller
+ Arbetsfordon
+ Traktorer
...[/blue]

Databasen ser ut så här:

[red]
id  |    cat_name    | cat_parent_id | cat_level_id
---------------------------------------------------
10  | Bilar          |     0         |      1
11  | Arbetsfordon   |     0         |      1
12  | Traktorer      |     0         |      1
13  | Kombi-modeller |     10        |      2
14  | Sedan-modeller |     10        |      2
15  | V40            |     13        |      3
16  | V50            |     13        |      3
17  | V70            |     13        |      3
18  | Interiör       |     17        |      4
19  | Exteriör       |     17        |      4
...[/red]

Jag stötte på patrull när jag nu försöker radera en hel kategori, ex. "Bilar",
som i exemplet ovan har en mängd underkategorier under sig.

Jag kan ju inte enbart gå på ID här utan det måste nog till en loop igenom hela
databasen för att kolla hur dom är relaterade till varande, annars kommer det bli
en massa spill kvar i databasen.. och det vill jag ju inte.

Någon som har nått bra tips eller idé på lösning? :)

 

Medlem sedan jan. 20032 285 inlägg
#2

Kan det här kanske funka? Har inte testat, men man kan ju hoppas. ;) (Om du inte ville ha det som en enda SQL-fråga?)

Sub DeleteTree(intId)
  strSQL = "SELECT id FROM tbl WHERE cat_parent_id = " & intId
  Set objRS = objConn.Execute(strSQL)

  If NOT objRS.EOF Then
    Do Until objRS.EOF
      DeleteTree objRS(0)
      objRS.MoveNext
    Loop
  End If

  objRS.Close : Set objRS = Nothing

  strSQL = "DELETE FROM tbl WHERE id = " & intId
  objConn.Execute(strSQL),,128
End Sub

Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "..."
DeleteTree 10
objConn.Close : Set objConn = Nothing
Medlem sedan apr. 20003 174 inlägg
#3

Hmm, nja.. det känns inte bra att göra så. ;)
Det blir sjukt många rundor den måste snurra för att plocka upp allt.

r/: Efter test får jag följande felmeddelande: Out of memory: 'objConnect.Execute'

Medlem sedan dec. 200012 464 inlägg
#4

http://www.intelligententerprise.com/001020/celko.jhtml?_requestid=57016

Det finns en relevant länk till i tråden om self-join.

Flyttas från ASP

Medlem sedan apr. 20003 174 inlägg
#5

Hmm.. jag får inget på den sidan att fungera tyvärr. :r
Har du någon mer länk eller exempel som tar upp detta?

Jag kan lista relationerna, men jag får inte till hur jag ska lyckas få
in id´t på den parent, med underkategorier, som jag vill radera.

[red]SELECT a.cat_name AS parent, b.cat_name AS child FROM tbl AS a, tbl AS b WHERE a.id = b.cat_parent_id;[/red]
Medlem sedan mars 20034 471 inlägg
#6

Hur ser din tabelldefinition ut? Om cat_parent_id är foreign key till id (vilket den borde vara), så borde väl en cascade on delete kunna hjälpa dig? :q

Medlem sedan apr. 20003 174 inlägg
#7

Re: Hur radera poster, relaterade till andra poster?

Palle skrev:

Har stött på patrull när jag ska försöka radera poster från databasen (mySQL),
jag vet inte riktigt hur jag ska göra för att göra det riktigt smidigt.

Eftersom mySQL ännu inte stödjer sub-querys, och således heller inte cascade delete,
så är svaret på din fråga - Nej, det hjälper mig inte.

Medlem sedan apr. 20003 174 inlägg
#8

Ok, om vi ändrar lite på min approach här. ;)
Säg att jag vill lista alla relaterade underkategorier till, ur mitt exempel, Kombi-modeller.

Hur ska jag då göra?
Tips?

Medlem sedan apr. 20003 174 inlägg
#9

Någon som har nått konkret tips att bjuda på? :)

Medlem sedan nov. 20017 144 inlägg
#10

Men det lär väl bli en rekursiv funktion i presentationslagret för att göra det.

Sub ShowTree(intId)
  strSQL = "SELECT cat_name,id FROM tbl WHERE cat_parent_id = " & intId
  Set RS = objConn.Execute(strSQL)

  If NOT objRS.EOF Then
    Do Until objRS.EOF
         Response.write(RS(0)&" | "& RS(1) &"<br>")
      ShowTree RS(0)
      objRS.MoveNext
    Loop
  End If
End Sub

Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "..."
ShowTree 10
objConn.Close : Set objConn = Nothing

Eller tänker du på ngt annat?

Medlem sedan apr. 20003 174 inlägg
#11

Jesper T skrev:

Men det lär väl bli en rekursiv funktion i presentationslagret för att göra det.

En massa kod..

Eller tänker du på ngt annat?

Palle skrev:

Hmm, nja.. det känns inte bra att göra så. ;)
Det blir sjukt många rundor den måste snurra för att plocka upp allt.

r/: Efter test får jag följande felmeddelande: Out of memory: 'objConnect.Execute'

Nja, det där har jag ju redan testat och det fungerar inte.. :(

Medlem sedan nov. 20017 144 inlägg
#12

Det kan vara att min kåd är felskriven men, skall du hämta alla underliggande "kategorier" så måste det väl vara någon form av rekursiv funktion. Eventuellt så kan man med en SP i MsSql göra det samma, vet inte riktigt.

Medlem sedan apr. 20003 174 inlägg
#13

Jesper T skrev:

Det kan vara att min kåd är felskriven men, skall du hämta alla underliggande "kategorier" så måste det väl vara någon form av rekursiv funktion. Eventuellt så kan man med en SP i MsSql göra det samma, vet inte riktigt.

Nja.. jag hade, innan jag postade här, testat en liknande funktion.. men när funktionen gjort
några 1000 loopar/execute så fick jag det där felmeddelandet.. så jag tror inte att en sådan
funktion är tillräckligt stabil för att jag skulle använda den. :OO

Jag använder som sagt mySQL här så någon SP kan jag heller inte skapa. *suck* :x

258 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)