[SQL, Interbase] Record(s) verwijderen uit meerdere tabellen

Pagina: 1
Acties:
  • 742 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

Anoniem: 18761

Topicstarter
Ik heb de volgende 2 tabellen:

ARTIKELENRECLAME:
===============
ReclameID PK
ArtikelID FK
Startdatum
Einddatum
Normaleprijs
Actieprijs
Omschrijving
....

RECLAMELEVERINGEN:
================
LeveringID PK
ReclameID FK
Leveringsdatum
Aantalcollie
......


Nu wil ik alle records verwijderen uit artikelenreclame waar artikelid bijv 1 is.

Nu kunnen er dus ook leveringen zijn. Dus die moeten er eerst uit verwijderd (vanwege foreign key).

Maar hoe kan ik dit het beste doen, want je mag geen join's gebruiken in een delete query?

(Het liefste wil ik niet eerst de de waarde van reclameid opvragen en vervolgens die gebruiken om het record uit reclameleveringen te verwijderen en daarna in artikelenreclame)

Ik gebruik dit trouwens i.c.m. Delphi.

Acties:
  • 0 Henk 'm!

  • Donderwolk
  • Registratie: Januari 2002
  • Laatst online: 26-01-2024
kun je niet een select query in een delete query nesten?

(DonderWolk heeft niet zoveel verstand van SQL)

Pwnd


Acties:
  • 0 Henk 'm!

  • momania
  • Registratie: Mei 2000
  • Laatst online: 13:34

momania

iPhone 30! Bam!

Ken interbase geen 'cascade delete' ?

Neem je whisky mee, is het te weinig... *zucht*


Acties:
  • 0 Henk 'm!

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Anoniem: 18761 schreef op 05 november 2002 @ 17:40:
Maar hoe kan ik dit het beste doen, want je mag geen join's gebruiken in een delete query?
Geen join's? Je mag niet records uit meerdere tabellen tegelijk verwijderen, maar wel join's gebruiken.
Als een cascaded delete mogelijk is dan zou je dat kunnen doen en anders moet je in een transactie twee delete statements zetten.

Never underestimate the power of


Acties:
  • 0 Henk 'm!

Anoniem: 18761

Topicstarter
Is het gebruik van triggers misschien het beste?

En hoe zit het met vervolgens met zo'n trigger, want je werkt normaal gesproken met een transactie. Vinden al die wijzigingen (delete's) in die trigger dan ook plaats in die transactie of wordt er voor een trigger weer een aparte transactie gestart?

Acties:
  • 0 Henk 'm!

  • Ruidasilva
  • Registratie: Mei 2002
  • Niet online

Ruidasilva

Funky & Creative

Ehmz...........
Dacht dat het project toch al afgelopen was Martin......!! ;)

Music is no longer an expression of the soul or the work of an artist; it's a 'product' that is manufactured, packaged, catalogued, distributed, managed, regulated, and above all sold!


Acties:
  • 0 Henk 'm!

Anoniem: 18761

Topicstarter
Ruidasilva schreef op 05 november 2002 @ 21:33:
Ehmz...........
Dacht dat het project toch al afgelopen was Martin......!! ;)
Nee dit is weer een ander project

Acties:
  • 0 Henk 'm!

  • johnny7
  • Registratie: November 2000
  • Laatst online: 07-11-2023
Interbase ondersteunt toch gewoon transacties? Gewoon twee delete query's. Mocht er iets misgaan kun je een rollback uitvoeren en is de integriteit van de database niet aangetast.

Acties:
  • 0 Henk 'm!

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 30-03 10:49

Goodielover

Only The Best is Good Enough.

code:
1
2
3
4
5
6
7
8
9
10
delete from RECLAMELEVERINGEN
where ReclameID IN
     (select ReclameID
      from   ARTIKELENRECLAME
      where  ArtkelID = 1
     );
delete from   ARTIKELENRECLAME
where  ArtkelID = 1;

commit;

Acties:
  • 0 Henk 'm!

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Anoniem: 18761 schreef op 05 november 2002 @ 21:31:
En hoe zit het met vervolgens met zo'n trigger, want je werkt normaal gesproken met een transactie. Vinden al die wijzigingen (delete's) in die trigger dan ook plaats in die transactie of wordt er voor een trigger weer een aparte transactie gestart?
Kijk eens naar ACID en trek je conclusies.

Today's subliminal thought is:


Acties:
  • 0 Henk 'm!

Anoniem: 18761

Topicstarter
Goodielover schreef op 06 november 2002 @ 10:49:
code:
1
2
3
4
5
6
7
8
9
10
delete from RECLAMELEVERINGEN
where ReclameID IN
     (select ReclameID
      from   ARTIKELENRECLAME
      where  ArtkelID = 1
     );
delete from   ARTIKELENRECLAME
where  ArtkelID = 1;

commit;
Bedankt,

Voorlopig doe ik het zo, maar ik ga het uitzoeken over die triggers, omdat dat volgens mij beter is:

1) scheelt behoorlijk wat code in delphi
2) je kan dan via een db-tooltje ook gewoon een artikel verwijderen ==> de triggers zorgen er dan voor dat alle referenties in de andere tabellen verwijderd worden.

Acties:
  • 0 Henk 'm!

Anoniem: 18761

Topicstarter
Ik heb het een en ander over triggers opgezocht en heb het volgende gemaakt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TRIGGER ARTIKELEN_BD0 FOR ARTIKELEN
ACTIVE BEFORE DELETE POSITION 0
AS
begin
  DELETE
  FROM   RECLAMELEVERINGEN
  WHERE  RECLAMEID IN
         (SELECT RECLAMEID
          FROM   ARTIKELENRECLAME
          WHERE  ARTIKELID = :ARTIKELID);

  DELETE
  FROM   ARTIKELENRECLAME
  WHERE  ARTIKELID = :ARTIKELID;
end

Alleen hoe kom ik aan de waarde van ARTIKELID? Normaal gesproken heb je bij updates een NEW en OLD waarde, maar bij delete heb je die niet.

[ edit ]
Foutje, je blijkt wel een OLD waarde te hebben in een delete trigger :)
[ /edit ]

Acties:
  • 0 Henk 'm!

Anoniem: 30225

Anoniem: 18761 schreef op 05 November 2002 @ 17:40:
Ik heb de volgende 2 tabellen:

ARTIKELENRECLAME:
===============
ReclameID PK
ArtikelID FK
Startdatum
Einddatum
Normaleprijs
Actieprijs
Omschrijving
....

RECLAMELEVERINGEN:
================
LeveringID PK
ReclameID FK
Leveringsdatum
Aantalcollie
......


Nu wil ik alle records verwijderen uit artikelenreclame waar artikelid bijv 1 is.

Nu kunnen er dus ook leveringen zijn. Dus die moeten er eerst uit verwijderd (vanwege foreign key).

Maar hoe kan ik dit het beste doen, want je mag geen join's gebruiken in een delete query?
toon volledige bericht
Definieer een constraint voor de foreign key in de tabel RECLAMELEVERINGEN
code:
1
2
3
FOREIGN KEY (ReclameId) REFERENCES ARTIKELENRECLAME (ReclameId)
ON UPDATE CASCADE
ON DELETE CASCADE

And your finished...
code:
1
2
DELETE ARTIKELENRECLAME
WHERE ReclameId=1

Acties:
  • 0 Henk 'm!

Anoniem: 18761

Topicstarter
Bedankt,

weer wat nieuws geleerd.

Acties:
  • 0 Henk 'm!

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Anoniem: 18761 schreef op 07 november 2002 @ 22:55:
Bedankt,

weer wat nieuws geleerd.
Als je nu de post van momania van twee dagen terug wat beter bekeken had, was je hier misschien wel iets sneller achter gekomen. |:(
Dan had het je vast een hoop tijd minder gekost.

Never underestimate the power of


Acties:
  • 0 Henk 'm!

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Iets nieuws?
Mag ik u herinneren aan:
momania schreef op 05 november 2002 @ 17:43:
Ken interbase geen 'cascade delete' ?
edit: damn you cameodski ;)

Today's subliminal thought is:


Acties:
  • 0 Henk 'm!

Anoniem: 18761

Topicstarter
cameodski schreef op 07 november 2002 @ 23:07:Als je nu de post van momania van twee dagen terug wat beter bekeken had, was je hier misschien wel iets sneller achter gekomen. |:(
Dan had het je vast een hoop tijd minder gekost.
Ik had n.a.v. de post van momania wel gezocht op cascade en interbase. Maar ik had niks gevonden. (Documentatie van interbase is nou niet echt perfect). En aangezien het niet uitvoerig beschreven staat in zijn post, heb ik voor de rest niks meegedaan.

In eerste instantie dacht ik ook nog dat het niet ondersteunt wordt door interbase (lang niet alles SQL dingen worden ondersteund door interbase)

Acties:
  • 0 Henk 'm!

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Anoniem: 18761 schreef op 08 november 2002 @ 10:14:
Ik had n.a.v. de post van momania wel gezocht op cascade en interbase. Maar ik had niks gevonden. (Documentatie van interbase is nou niet echt perfect). En aangezien het niet uitvoerig beschreven staat in zijn post, heb ik voor de rest niks meegedaan.

In eerste instantie dacht ik ook nog dat het niet ondersteunt wordt door interbase (lang niet alles SQL dingen worden ondersteund door interbase)
Tja, kan gebeuren.

Never underestimate the power of


Acties:
  • 0 Henk 'm!

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 30-03 10:49

Goodielover

Only The Best is Good Enough.

Was het trouwens niet zo dat je in de trigger die je eerder had gebouwd niet de delete op de eigenlijke tabel had moeten weglaten.
Je had een soort PRE-DELETE-trigger gemaakt, wat dus inhoudt dat de delete zelf nog moest gebeuren. Volgens mij zou de volgende code ook hebben gewerkt:
code:
1
2
3
4
5
6
7
8
9
10
11
CREATE TRIGGER ARTIKELEN_BD0 FOR ARTIKELEN
ACTIVE BEFORE DELETE POSITION 0
AS
begin
  DELETE
  FROM   RECLAMELEVERINGEN
  WHERE  RECLAMEID IN
         (SELECT RECLAMEID
          FROM   ARTIKELENRECLAME
          WHERE  ARTIKELID = :OLD_ARTIKELID);
end

Ik begrijp wel dat de trigger handiger is, maar als je geconditioneerd een cascade/restricted wil uitvoeren kom je toch weer op triggers uit. Vandaar deze toevoeging.
Pagina: 1