Avatar billede EIHP Juniormester
19. april 2012 - 18:49 Der er 6 kommentarer og
1 løsning

mysql update effekter kun de første 667 entries..

UPDATE account SET balance = balance * .99 where balance < 10000
men der er 1726 entries med en balance under 10000

hvad gør jeg forkert?
Avatar billede arne_v Ekspert
19. april 2012 - 19:05 #1
Det lyder mystisk. Det boer virke.

(at *0.99 paa beloeb er en doedssynd er en anden sag)
Avatar billede EIHP Juniormester
19. april 2012 - 19:44 #2
nej den skal fjerne 1% hver gang den bliver udført..
Avatar billede mireigi Novice
20. april 2012 - 00:23 #3
Jeg tror det arne_v mener, er at du ganger et decimaltal med et andet decimaltal, uden at de nødvendigvis har samme præcision/scale. Når det sker, kan resultatet blive truncated (rundet/skåret af)

Det kan give forskellige og/eller uventede resultater, hvis du har følgende:

base            decimal(5, 2)      5 tal i alt, maks 2 decimaler
multiplier      decimal(5, 3)      5 tal i alt, maks 3 decimaler

base            = base * multiplier

base            = 100,00
multiplier      = 50,000
base            = 100,00 * 50,000 = 5000,000 = 5000,00

Her går det fint, men hvad i dette tilfælde?

base            = 75,50
multiplier      = 22,125
base            = 75,50 * 22,125 = 1670,4375 = 1670,44

En lille forskel her måske, men med store tal, med mange decimaler kan det hurtigt komme ud af kontrol.


Den lidt længere, og tal-type uafhængige metode er:
balance = (balance * 99) / 100
Avatar billede erikjacobsen Ekspert
22. april 2012 - 23:39 #4
Nu må I ikke grine, men jeg kan li'som kun se to måder hvorpå det beskrevne kan indtræffe, og det er hvis feltet balance er en int.

33*0.99 afrundet giver 33 - ingen ændring.
77*0.99 giver 76 efter afrunding.

De tilfældet hvor værdierne ikke bliver ændret, tæller i MySQL ikke som en ændret række.

Ok, jeg ved det, lidt langt ude....

En anden ting kunne være, at feltet er en float, men der er mange med værdien 0.00, der li'som heller ikke ændrer sig ved at gange 0.99 på.
Avatar billede mireigi Novice
23. april 2012 - 00:54 #5
Float er faktisk værre end Decimal i henhold til usikkerhed ved beregninger.

Du kan jo prøve at køre dette:
SELECT balance, ((balance * 99) / 100) AS NewBalance FROM account where balance < 10000


Så burde du jo få alle rækkerne ud med de nye værdier. Gør du ikke det, er der noget galt med dine data.
Avatar billede EIHP Juniormester
18. september 2012 - 10:09 #6
Tak mireigi

Smider du et svar?
Avatar billede mireigi Novice
19. september 2012 - 11:45 #7
Velbekomme :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester