Toon posts:

[MySQL] Redundante data verwijderen met JOIN te enthousiast

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Ik ben bezig aan een gegevensbank voor een portfolio. Dit is de opzet:

Project (een website, een filmpje,...):
Afbeeldingslocatie: http://img106.imageshack.us/img106/9915/projectdj6.png

Dimensie (welke competenties er in het project terugkomen):
Afbeeldingslocatie: http://img106.imageshack.us/img106/3039/dimensieaa2.png

Aandeel (de zwaarte van een competentie):
Afbeeldingslocatie: http://img106.imageshack.us/img106/7931/aandeelsy0.png

Als ik nu beslis een project te verwijderen, wil ik het ook zo dat alle aandelen worden verwijderd (wat nog makkelijk is), maar ook moet de dimensie verwijderd worden als 'ie alleen overblijft. Ik dacht het met een JOIN te kunnen oplossen, maar die gooit de dimensie altijd weg, ook al hoort 'ie nog bij een ander project. Ik gebruik deze query:

code:
1
DELETE dimensie.*, aandeel.* FROM dimensie INNER JOIN aandeel ON dimensie.id = aandeel.dimensie_id WHERE aandeel.project_id = 1;


Ik heb al geprobeerd om een COUNT in het WHERE-gedeelte te zetten, maar dat mislukt dus. Hulp? :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Dit heeft niets met SEA te maken; eerder gewoon met programming.

Ik weet niet hoe het in MySQL zit, maar heb je daar niet zoiets als foreign key constraints ? Dan zou het iig niet mogen gebeuren dat een record verwidjerd wordt als het nog door iets anders gebruikt wordt. En als je FKC's hebt, kijk dan ook eens of er cascading foreign key constraints bestaan.
zowiezo vind ik het raar dat je met één SQL DELETE statement, records uit meerdere tabellen kan verwijderen, maar dat zal ook weer een eigenaardigheid van mysql zijn zeker...

-> PRG

https://fgheysels.github.io/


  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-09 20:59
Ik zou het verwijderen gewoon verdelen over meerdere DELETE statements, eventueel kan je ze dan binnen een transactie uitvoeren zodat je database niet corrupt raakt als er een delete statement in de transactie de soep in loopt. Hiervoor dien je overigens wel gebruik te maken van de InnoDB engine. En als je die zou gaan gebruiken zou je ook foreign key constraints kunnen gebruiken, zodat al je gekoppelde rijen van een project ook automatisch verwijderd worden als je het project zelf verwijderd.

If I can't fix it, it ain't broken.


  • Rafe
  • Registratie: Mei 2002
  • Laatst online: 27-06 13:12
whoami schreef op zondag 25 maart 2007 @ 18:57:
Ik weet niet hoe het in MySQL zit, maar heb je daar niet zoiets als foreign key constraints ?
Alleen als je InnoDB gebruikt als database engine. In de toekomst met versie 5.2 hebben alle database engines er ondersteuning voor als ik het me goed herinner.

[ Voor 8% gewijzigd door Rafe op 25-03-2007 19:31 ]


Verwijderd

Topicstarter
Borizz schreef op zondag 25 maart 2007 @ 18:58:
Ik zou het verwijderen gewoon verdelen over meerdere DELETE statements, eventueel kan je ze dan binnen een transactie uitvoeren zodat je database niet corrupt raakt als er een delete statement in de transactie de soep in loopt.
Dat was het oorspronkelijke plan, maar ik zag even door de bomen het bos niet meer - waar begin ik best eerst te verwijderen? Ondertussen heb ik mijn tabellen al naar InnoDB geconverteerd.

Verwijderd

delete from dimensies where dim_id NOT IN (select dim_id from project_dim_weight);

even snel meenemen met je andere deletes?

  • x-force
  • Registratie: Maart 2001
  • Laatst online: 05-01-2024
offtopic:
waarom zet je meerdere keren de zelfde waardes in de tabel demensie? Dat is toch helemaal niet nodig?

VangenopBetaalwater.nl Het platform om ervaringen over betaalwater in Frankrijk te delen met andere karpervissers zodat iedereen kan vangen op betaalwater!


Verwijderd

x-force schreef op maandag 26 maart 2007 @ 14:28:
offtopic:
waarom zet je meerdere keren de zelfde waardes in de tabel demensie? Dat is toch helemaal niet nodig?
Ik denk dat de 'aandeel' tabel een koppeltabel is met extra informatie (gewicht).
Dus denk ik niet dat er 'dubbels' in voorkomen.
(enfin, daar ging ik toch van uit :))
Pagina: 1