Toon posts:

SQL: record exists (controle of het record al bestaat)

Pagina: 1
Acties:

Verwijderd

Topicstarter
INSERT INTO "C:\SDK\archief\klantnaam2003\archief.dbf" FROM memvar

Ik copieer records uit de tabel cost.dbf naar archief.dbf.
Hoe kan ik er voor zorgen dat ik niet steeds dubbele records krijg in het archief.dbf

Als het record al bestaad hoeft deze niet er nog een keer worden geupdate. Ik programmeer in FoxPro. maar volgens mij kan dit wel met SQL statements.

Ik heb de SQL Tutorial al doorgespit. http://www.w3schools.com/sql/

[ Voor 18% gewijzigd door Verwijderd op 14-04-2003 13:07 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:02
Je kunt een unique index op het veld leggen waar je geen dubbels in wilt. Als je dan een waarde wilt inserten die al bestaat in die table, dan zal de database een error gooien.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Hey dat is slim, maar dan heb ik een error. Dan stop heel mijn programma toch?

  • dominic
  • Registratie: Juli 2000
  • Laatst online: 21-08 19:07

dominic

will code for food

Wil je geen errors, dan kun je in SQL een IF EXISTS(select statement) gebruiken, wanneer de uitkomst false is, kun je inserten.

Download my music on SoundCloud


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:02
Verwijderd schreef op 14 April 2003 @ 13:08:
Hey dat is slim, maar dan heb ik een error. Dan stop heel mijn programma toch?
Nee hoor.
Je kunt die error opvangen in je applicatie (welke taal gebruik je voor dat programma) dmv exception handling. Dan doe je met de error wat je wilt.
dominic schreef op 14 April 2003 @ 13:09:
Wil je geen errors, dan kun je in SQL een IF EXISTS(select statement) gebruiken, wanneer de uitkomst false is, kun je inserten.
Dat zal wel een negatieve invloed hebben op de performance.

[ Voor 30% gewijzigd door whoami op 14-04-2003 13:11 ]

https://fgheysels.github.io/


  • dominic
  • Registratie: Juli 2000
  • Laatst online: 21-08 19:07

dominic

will code for food

whoami schreef op 14 april 2003 @ 13:10:
[...]


Nee hoor.
Je kunt die error opvangen in je applicatie (welke taal gebruik je voor dat programma) dmv exception handling. Dan doe je met de error wat je wilt.


[...]


Dat zal wel een negatieve invloed hebben op de performance.
Zal 0.1ms schelen denk ik.. Idd performanceverlies maar waarschijnlijk toch verwerpelijk..

Download my music on SoundCloud


Verwijderd

whoami schreef op 14 april 2003 @ 13:10:
[...]


Nee hoor.
Je kunt die error opvangen in je applicatie (welke taal gebruik je voor dat programma) dmv exception handling. Dan doe je met de error wat je wilt.


[...]


Dat zal wel een negatieve invloed hebben op de performance.
Ja, natuurlijk !
Alles dat je extra uitvoert levert een stukje performance verlies.
Misschien moet je eerst kijken naar het model (of als het een conversie betreft, dan duurt het maar wat langer) !

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:02
dominic schreef op 14 April 2003 @ 13:35:
[...]


Zal 0.1ms schelen denk ik.. Idd performanceverlies maar waarschijnlijk toch verwerpelijk..
Dat kan je niet weten.
Als de Topicstarter een aantal records in batch wil gaan inserten, (stel 1000), dan zal dat een performantieverlies zijn van xxx ms per record.

https://fgheysels.github.io/


Verwijderd

Wat je ook kan doen is een extra veld opnemen (in cost.dbf) waarin een vlaggetje gezet wordt als dat record "gearchiveerd" wordt. Ik ga ervan uit dat je alle gegevens in cost.dbf wilt houden...?

[ Voor 8% gewijzigd door Verwijderd op 14-04-2003 13:44 ]


Verwijderd

Topicstarter
Dit werkt super, ik programmeer in FoxPro, ik heb het veld uniek gemaakt. Geen error's.

Bedankt "whoami" ik kwam er echt niet uit. En het zo simpel. Even een andere denkwijze maar het werkt zoals het moet werken.

Verwijderd

Wel een ontzettend lelijke oplossing (maar het werkt wel !)...

Verwijderd

Topicstarter
Hoe werkt het met een IF EXISTS(select statement) dan

zoals ik al vertelde had ik 2 tabellen.

Ik krijg toch foutmeldingen in foxpro, hoe kan ik die afhandelen

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:02
Verwijderd schreef op 14 April 2003 @ 14:17:
Wel een ontzettend lelijke oplossing (maar het werkt wel !)...
Wat is een ontzettend lelijke oplossing?
De oplossing met de unique constraint is de mooiste oplossing, aangezien alles wat door het DBMS moet afgehandeld worden, ook door het DBMS afgehandeld wordt.

Voor de TS: ik kan geen Foxpro, maar heb je daar geen exception handling?

https://fgheysels.github.io/


  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 14-08 12:38

Crazy D

I think we should take a look.

Verwijderd schreef op 14 April 2003 @ 14:55:
Hoe werkt het met een IF EXISTS(select statement) dan
Ik weet niet of FoxPro if exists() ondersteunt, op MSSQL server krijg je iets als
code:
1
2
3
4
if exists(select veld from tabel where veld=een_waarde)
begin
    // doe iets met de kennis dat een_waarde is gevonden :)
end

Exact expert nodig?


Verwijderd

whoami schreef op 14 April 2003 @ 15:07:
[...]


Wat is een ontzettend lelijke oplossing?
De oplossing met de unique constraint is de mooiste oplossing, aangezien alles wat door het DBMS moet afgehandeld worden, ook door het DBMS afgehandeld wordt.

Voor de TS: ik kan geen Foxpro, maar heb je daar geen exception handling?
Je gaat je DBMS een error laten gooien op basis waarvan de informatie wel of niet niet geinsert wordt. Als je het door je DBMS wil laten "afhandelen", dan zorg je dat deze de keuze maakt de gegevens wel of niet te inserten en laat je hem eventueel een nette boodschap terug geven.

Hiervoor maak je dan geen "misbruik" van errors !

[ Voor 5% gewijzigd door Verwijderd op 14-04-2003 16:02 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:02
Die nette boodschap kan je altijd laten teruggeven.
Waarom zou je er voor kiezen om die gegevens wel nog te kunnen inserten? Het is niet voor niets een unique constraint.

https://fgheysels.github.io/


Verwijderd

Ik denk dat we het redelijk met elkaar eens zijn (hooguit praten we een klein beetje langs elkaar heen...)

Enig punt waar ik over val is jouw opmerking:
Je kunt een unique index op het veld leggen waar je geen dubbels in wilt. Als je dan een waarde wilt inserten die al bestaat in die table, dan zal de database een <br>error</br> gooien.
Het blijft echter zonde de gegevens naar de database te versturen terwijl deze al een keer verstuurd zijn...

[ Voor 16% gewijzigd door Verwijderd op 14-04-2003 16:21 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:02
Verwijderd schreef op 14 April 2003 @ 16:20:
Het blijft echter zonde de gegevens naar de database te versturen terwijl deze al een keer verstuurd zijn...
Tja, dat weet je op het moment van versturen niet.

Het is trouwens niet meer zonde dan vooraf te gaan kijken of de gegevens al in de DB zitten of niet.

https://fgheysels.github.io/


Verwijderd

Vlaggetje zetten in de cont.dbf en deze als voorwaarde in de update statement mee geven.

Het kan de nodige roundtrips naar de database opleveren (in negatieve zin...)

Maar misschien is dat enigzins het doel voorbij gestreefd !

[ Voor 16% gewijzigd door Verwijderd op 14-04-2003 16:28 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:02
Verwijderd schreef op 14 april 2003 @ 16:28:
Vlaggetje zetten in de cont.dbf en deze als voorwaarde in de update statement mee geven.
Dan wordt de query ook naar de database gestuurd en daar uitgevoerd hoor.
Alleen zal er door die extra voorwaarde niets toegevoegd worden.
Het is dus ook een roundtrip naar de database.

https://fgheysels.github.io/


Verwijderd

Topicstarter
ik wil liever niet iets aan cost.dbf veranderen.

Hoe kan ik er voor zorgen dat ik in FoxPro geen foutmelding krijg. Want ik heb het veld cost_code niet uniek gemaakt maar een primaire sleutel.

Uniek was niet genoeg, hij blijft maar records toevoegen. Maar je ziet alleen de unieke record

[ Voor 74% gewijzigd door Verwijderd op 14-04-2003 16:40 ]

Pagina: 1