Thursday, September 16, 2010

ΠΩΣΚΑΝΩ - update σε sqlite και επιστρέφεται ο σωστός αριθμός γραμμών που τροποποιήθηκαν

Σε standard SQL όταν γίνεται ένα UPDATE Query και αυτό τελειώσει, σου επιστρέφεται το πλήθος των γραμμών που τροποποιήθηκαν. Το ίδιο και στην SQLite, με μία διαφορά.
Αν προσπαθήσεις να τρέξεις ξανά το ίδιο UPDATE σε SQL θα σου επιστραφούν 0 τροποποιημένες γραμμές αφού τίποτα δεν θα έχει αλλάξει. Στην SQLite δυστυχώς όσες φορές και να τρέξεις το query θα σου γυρίσει οτι κάποιες γραμμές τροποποιήθηκαν.
Ενα παράδειγμα.

Έστω πίνακας myTbl με μία εγγραφή και δύο πεδία id και val

idval
10


Εκτελούμε το ακόλουθο query σε sqlite:

sqlite>PRAGMA count_changes = 1;
sqlite>UPDATE myTbl SET val = 5 WHERE id = 1;
1

Το PRAGMA χρειάζεται για να πάρουμε πίσω το πλήθος των γραμμών που αλλάχτηκαν με το τελευταίο query.O πίνακας λοιπόν θα γίνει:

idval
15


Εαν τρέξουμε ξανά το ίδιο query θα πάρουμε πίσω πάλι τον αριθμό 1. Αρκετά προβληματικό αν κανείς βασίζεται σε αυτό για να εκτελέσει κάποια άλλα εργασία. Η λύση για να μην συμβεί κάτι τέτοιο είναι να τροποποιήσουμε το query ως ακολούθως:


sqlite>UPDATE myTbl SET val = 5 WHERE id = 1 AND val != 5;
0


Δεν ξέρω αν είναι κάποιο bug - προσωπικά έτσι μου φαίνεται, αλλά επειδή έφαγα 2 μέρες μ'αυτή την αηδία είπα να το μοιραστώ. Ελπίζω να σε βοηθήσω

No comments: