28. november 2005 - 17:04Der er
28 kommentarer og 1 løsning
'Cardinality' og u-updaterbare rows
Hey!
Jeg har en simpel tabel på 14 kolonner og 130 rows med auto_increment int(50) i første kolonne, som (tror jeg nok) også er primary key (hvadend det så betyder). Jeg prøver at updatere et felt, men vil kun opdatere i det første 126 rows og ikke pille ved de sidste 3. Tilfældigt så jeg der står 'cardinality' 126 et sted. Har det noget med det at gøre? Hvad er det og hvordan kan jeg rette det så den kan update hele tabellen?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Mit forslag gik på, at ved at sætte limit på 126, retter du kun i de 126 laveste id-numre. Hvis ikke det var det du mente, så forstår jeg desværre ikke. Det med 'cardinality' forstår jeg desværre heller ikke...
hvis jeg klikker 'structure' i phpMyAdmin så står det under listen af kolonner i en ny paragraf. Der står Indexes : [Documentation] Keyname Type Cardinality Action Field PRIMARY PRIMARY 126 id
Det kunne tyde på den skal hæves for at vise mere end de 126 rows? Og hvor(dan) gøt jeg det?
min 'id'-kolonne ser således ud: Field Type Attributes Null Default Extra Action id int(50) No auto_increment
Synes godt om
Slettet bruger
28. november 2005 - 17:44#9
Cardinality angiver (så vidt jeg umiddelbart kan se) hvor mange forskellige værdier, der findes i dette felt.
Forresten. Når du skriver "Jeg prøver at updatere et felt, men vil kun opdatere i det første 126 rows og ikke pille ved de sidste 3. ", mener du så "men DEN vil kun..."?
Hvis ja: Hvad er id for de sidste 3, som den ikke vil opdatere?
ok.. jeg er lidt forvirret...mere forstand har jeg heller ikke på mysql endnu ..men det lader bare ikke til at jeg kan ændre den der 'cardinality' nogen steder. er det min struktur, der er fejl i? jeg har lagt et screengrab af strukturen op på www.liquid-i.com/andet/
måske kan det hjælpe?
Synes godt om
Slettet bruger
28. november 2005 - 18:00#14
Ja jaw, du svarede faktisk på det der reelt blev spurgt om.
Og jeg har nu fundet frem til at cardinality udelukkende er et "gæt" fra databasens side, om hvor mange forskellige værdier, der findes i det indekserede felt. Det benyttes af databasen til at beslutte om den skal bruge indekset eller bare lede hele tabellen igennem. Så cardinality har altså ikke noget med dit problem at gøre.
nu er der lagt flere rows ind i tabellen siden sidst og jeg synes der er sket nogle underlige ting. der er et spring fra 129 til 132 i den auto-incrementerede 'id'. Dette skyldes at jeg manuelt redigerede id'erne på 126-128. Der er 132 rows i det hele, men det højeste id er nu 135, så det ser således ud: id ... 128 129 132 -!!! 133 134 135
Igen vil min php side ikke opdatere sidste kolonne 'show' på de sidste 4. Aner ikke hvorfor.
Det har ikke noget med kardinaliteten at gøre. Dette er egentlig også først relevant hvis du begynder at optimere med indexes eller hvis du bruger fremmednøgler. At kardinaliteten er 126 betyder blot at du har 126 rækker i tabellen - det gælder ikke hvis du har lavet flere indexes eller bruger fremmednøgler!
Det højeste tal der er givet med auto_increment nummereringen er ikke nødvendigvis det samme som det antal rækker du har i din tabel. Du kan f.eks. godt have et ID på den senest tilføjede række der heddder 130, men kun have 126 rækker i tabellen. Netop fordi der kan være slettet nogen rækker et eller andet sted. Dermed kommer der et spring i talrækken!
Er dit problem at du foretager en ændring i alle rækkerne, og så får et svar fra MySQL om at ændringen blev foretaget på 126 rækker? Og ikke ikke 129?
Prøv evt. at køre denne SQL der fortæller dig hvor mange rækker der reelt findes i din tabel.
SELECT COUNT(*) FROM tabel
Mvh. Morten
Synes godt om
Slettet bruger
28. november 2005 - 20:12#25
Ja, din løkke kan ikke håndtere huller i talrækken. Og opgaven bliver kompliceret af, at browsere vistnok kun sender information om checkboxe, når de er krydset af.
$sql_set="UPDATE `db_timer` SET `show` = '1' WHERE `id` IN ("; $sql_slet="UPDATE `db_timer` SET `show` = '0' WHERE `id` NOT IN (";
if(strlen($ettere)>2){ $sql_set .= substr($ettere,0,-2) . ")"; $sql_slet .= substr($ettere,0,-2) . ")"; mysql_query($sql_set); mysql_query($sql_slet); } else { // Der er ingen, der skal sættes, altså skal alle slettes mysql_query("UPDATE `db_timer` SET `show` = '0'"); }
Hey Morten, jeg har en htmlliste spyttet ud fra php/mysql. Den lister alle rows i tabellen med et flueben ved siden. De kan så klikkes fra eller til afhængig af hvilke der skal være aktive ude på 'forsiden'. Ved submit sender den så hele listen igennem og opdaterer hver enkelt 'addition'. jeg har smidt filen op på liquid-i.com/andet/fil.zip sammen med strukturen på www.liquid-i.com/andet/ Jeg håber det kan hjælpe til at gennemskue..
jamen det virkede jo. tusind tak! det havde jeg aldrig kunne brygge sammen det der! :)
Synes godt om
Slettet bruger
29. november 2005 - 00:51#29
Og så laver det højst to kald til databasen i stedet for ca 130. Det betyder en del for performance.
Og så var det vist tid til et svar.
Synes godt om
Ny brugerNybegynder
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.