webForumDet fria alternativet

DELETE från tre tabeller med olika relationer

Databaser & SQLur Databashanterare & SQL

17 svar · 411 visningar · startad av Melea

MeleaMedlem sedan juli 20033 147 inlägg
#1

Tjenixen!

Har fastnat... jag har tre tabeller som jobbar mellan varandra typ, såhär:

tbl_project - id
tbl_business - projectid (relation till tbl_project id)
tbl_comment - businessid (relation till tbl_business id)

Hur kan jag skriva en fråga som tar bort från alla dessa tabeller med ett id (tbl_project id)?

Tack på förhand!

Peter SMedlem sedan dec. 20025 483 inlägg
#2

DBMS?

I nyare versioner av MySQL kan du testa:

delete p
     , b
     , c
  from tbl_project  p
     , tbl_business b
     , tbl_comment  c
 where p.id = <id>
   and p.id
     = b.projectid
   and c.businessid
     = b.projectid
MeleaMedlem sedan juli 20033 147 inlägg
#3

Har MySQL 4.1.10, men det ville sig inte riktigt.

DELETE p, b, c
FROM p_project p, p_business b, p_comment c
WHERE p.id = $_GET[projectid]
    AND p.id = b.projectid
        AND c.businessid = b.projectid

/r
Hm, relationen var p.id till b.projectid och b.id till c.businessid

Peter SMedlem sedan dec. 20025 483 inlägg
#4

Vad händer om du skippar alias?

delete tbl_project  p
     , tbl_business b
     , tbl_comment  c
  from tbl_project
     , tbl_business
     , tbl_comment
 where p.id = <id>
   and p.id
     = b.projectid
   and c.businessid
     = b.id
MeleaMedlem sedan juli 20033 147 inlägg
#5

Då får jag upp

Table 'project.tbl_project' doesn't exist

/r
Hold your horses, det står fel, vänta lite. ;)

/r #2
Det funkar! :)
Hur kommer det sig att prefixerna inte går att använda här?

/r #3
Detta funkar

delete tbl_project p
	 , tbl_business b
	 , tbl_comment c
  from tbl_project p
	 , tbl_business b
	 , tbl_comment c
 where p.id = <id>
   and p.id
	 = b.projectid
   and c.businessid
	 = b.id
LarsGMedlem sedan dec. 200012 464 inlägg
#6

Definiera foreign keys med on delete cascade.

MeleaMedlem sedan juli 20033 147 inlägg
#7

LarsG skrev:

Definiera foreign keys med on delete cascade.

Heroglyfer för mig, vad menar du? ;)

LarsGMedlem sedan dec. 200012 464 inlägg
#8

Om du definierar en foreign key med on delete cascade från t1 till t2 så innebär det att om du gör delete på poster i t2 så kommer poster som refererar dessa i t1 också att tas bort.

MeleaMedlem sedan juli 20033 147 inlägg
#9

Detta är en inställning man kan göra i MySQL? Eller har jag helt missförstått dig? :)
Hur löser jag detta bäst isåfall?

LarsGMedlem sedan dec. 200012 464 inlägg
#10

Jo, titta under create eller alter table i manualen.

MeleaMedlem sedan juli 20033 147 inlägg
#11

Tackar!

Om jag ska köra med den koden Peter gav mig tills vidare, så funkar det inte riktigt.
Om det inte finns några poster i tbl_business eller tbl_comment så tas inte projektet bort.

MeleaMedlem sedan juli 20033 147 inlägg
#12

*bump*

Melea skrev:

Om jag ska köra med den koden Peter gav mig tills vidare, så funkar det inte riktigt.
Om det inte finns några poster i tbl_business eller tbl_comment så tas inte projektet bort.

Peter SMedlem sedan dec. 20025 483 inlägg
#13

Det är bättre att göra rätt från början. :) Med Lars förslag kan det då se ut enligt:

create table tbl_business(
  id int,
  projectid int,
  primary key (id),
  foreign key (projectid)
    references tbl_project (id)
      on delete cascade
)
MeleaMedlem sedan juli 20033 147 inlägg
#14

Har suttit och testat som en tok nu, men får inte till det. :x
Att skapa tabellen med foreign key funkar utmärkt, precis enligt din princip Peter.
Men om jag tar bort en post från tbl_project, där jag har en eller flera poster i tbl_business tas inte dessa bort.
Har läst manualen här hur man ska gå tillväga men det vill sig inte.

När jag ska skapa tbl_business lägger jag till

FOREIGN KEY (`projectid`) REFERENCES tbl_project (`id`) ON DELETE CASCADE

Efter PRIMARY KEY.
Detta genererar inga felmeddelanden.

/r Ah, läste nu att det måste vara InnoDB.
Finns det någon liknande syntax för MyISAM eller måste jag konvertera om till InnoDB?

LarsGMedlem sedan dec. 200012 464 inlägg
#15

Foreign keys fungerar inte i MYISAM.

MeleaMedlem sedan juli 20033 147 inlägg
#16

Då blir det till att konvertera då! :)

Tack för hjälpen båda två!

MeleaMedlem sedan juli 20033 147 inlägg
#17

Gah, nu blir jag alldeles tokig på det här. :x
När jag nu ska skapa en tabell (efter att ha pillat i inställningarna i phpMyAdmin för att godkänna relationer mellan tabeller) så står det att den inte kan skapa tbl_project.frm.

Vad är frm för fil och varför går det inte att skapa den? :l

MeleaMedlem sedan juli 20033 147 inlägg
#18

Ah, nu fick jag igång det!
Hade rört ihop det med att FOREIGN KEY skulle vara på tbl_project, och uppåt. :)

springer och gömmer mig i skamvrån

256 ms totalt · 3 externa anrop · v20260731065814-full.c74b5be1
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
254 ms — hämta tråd, inlägg och bilagor (db)