Avatar billede themapplz Nybegynder
28. november 2005 - 17:04 Der 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?

PF tak,
Andreas
Avatar billede jaw Nybegynder
28. november 2005 - 17:06 #1
ORDER BY id ASC LIMIT 126 ?
Avatar billede themapplz Nybegynder
28. november 2005 - 17:09 #2
:) der er ikke noget limit på
Avatar billede themapplz Nybegynder
28. november 2005 - 17:10 #3
hvordan ændrer jeg det dersens cardiniality? har det noget med det at gøre?
Avatar billede jaw Nybegynder
28. november 2005 - 17:11 #4
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...
Avatar billede themapplz Nybegynder
28. november 2005 - 17:18 #5
nogen der kan hjælpe?
Avatar billede Slettet bruger
28. november 2005 - 17:19 #6
Cardinality kunne ganske udmærket have noget med det at gøre. Hvor så du det, og hvad stod der lige omkring?
Avatar billede themapplz Nybegynder
28. november 2005 - 17:27 #7
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?
Avatar billede themapplz Nybegynder
28. november 2005 - 17:29 #8
min 'id'-kolonne ser således ud:
Field     Type          Attributes    Null    Default    Extra          Action
  id        int(50)                No         auto_increment
Avatar billede 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?
Avatar billede themapplz Nybegynder
28. november 2005 - 17:44 #10
nogen der har en løsning på ham her?
Avatar billede themapplz Nybegynder
28. november 2005 - 17:47 #11
id på de sidste tre rows, som den ikke vil opdatere er netop 127,128 og 129.
og ja, queriet vil kun opdatere de første 126 rows
Avatar billede jaw Nybegynder
28. november 2005 - 17:49 #12
Ah, det gav så dit spørgsmål en helt anden mening, end jeg opfattede det...
Avatar billede themapplz Nybegynder
28. november 2005 - 17:56 #13
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?
Avatar billede 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.

Hvordan ser din update ud?
Avatar billede themapplz Nybegynder
28. november 2005 - 18:07 #15
før stod der 126 i cardinality, men, som på screengrabbet, står pludselig 128!
Avatar billede Slettet bruger
28. november 2005 - 18:15 #16
Som sagt: Det er ikke cardinality, der er årsagen til dit problem.

Hvordan ser din update ud?
Avatar billede themapplz Nybegynder
28. november 2005 - 18:50 #17
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.
Avatar billede jaw Nybegynder
28. november 2005 - 18:51 #18
Du vil simpelthen bare ikke svare på hvad der bliver spurgt om? Så er det jo altså heller ikke særlig nemt at hjælpe dig :S
Avatar billede themapplz Nybegynder
28. november 2005 - 18:56 #19
jeg forstår ikke spørgsmålet, så..sorry.. hvad mener du?
Avatar billede themapplz Nybegynder
28. november 2005 - 18:57 #20
ok!
$sql = "UPDATE `db_timer` SET `show` = '1' WHERE `id` = '$i'";
Avatar billede Slettet bruger
28. november 2005 - 19:05 #21
Det opdaterer jo også kun en række. Måske er det din løkke, den er gal med?

Mere kode, tak.
Avatar billede themapplz Nybegynder
28. november 2005 - 19:33 #22
Håber det her kan give en ide



<php

$result = mysql_query("SELECT id FROM db_timer");
$count = mysql_num_rows($result);
for ($i=1; $i<=$count; $i++) {
$val = $_POST['addition'][$i];
if(!$val){$val="0";}
echo $i." ".$val."<br>";

if($val=="0"){
$sql = "UPDATE `db_timer` SET `show` = '0' WHERE `id` = '$i'";
}
if($val=="1"){
$sql = "UPDATE `db_timer` SET `show` = '1' WHERE `id` = '$i'";
}
mysql_query($sql);



--html

og så løkken, med checkboxe, som bestemmer hvorvidt 'show'-kolonnen skal opdateres:

<?
$query  = "SELECT `id`,`ini`,`dato`,`kunde`,`show` FROM db_timer ORDER BY $sort DESC";
$result = mysql_query($query);
while($row = mysql_fetch_assoc($result)){
$a++;
echo "<tr class=\"data\"><td></td>";
$show = $row['show'];
$id = $row['id'];
if($show==1){
echo "<td height=\"15\" align=\"center\" nowrap class=\"col1\">\n<input name=\"addition[$id]\" type=\"checkbox\" value=\"1\" checked></td>\n";
}
else{
echo "<td height=\"15\" align=\"center\" nowrap class=\"col1\">\n<input name=\"addition[$id]\" type=\"checkbox\" value=\"1\"></td>\n";
}
echo "<td align=\"center\" nowrap class=\"col2\">{$row['ini']}</td>
<td align=\"center\" nowrap class=\"col2\">{$row['dato']}</td>
<td align=\"center\" nowrap class=\"col2\">{$row['kunde']}</td>
<td align=\"center\" class=\"col3\">";
echo "</td></tr>\n" ;
}
?>


I hvert fald mange tak indtil videre... :):)
Avatar billede themapplz Nybegynder
28. november 2005 - 19:34 #23
det har virket perfekt indtil videre. så lige pludselig begyndte den på det her med ikke at opdatere de sidste..totalt stenet :S
Avatar billede muddi Praktikant
28. november 2005 - 19:47 #24
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
Avatar billede 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.

Prøv med dette:

$ettere = "";
foreach ($_POST['addition'] as $i=>$vaerdi) {
  $ettere .= $i . ", ";
}

$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'");
}
Avatar billede themapplz Nybegynder
28. november 2005 - 20:16 #26
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..
Avatar billede themapplz Nybegynder
28. november 2005 - 20:18 #27
ok. kom li lidt sent. jeg kigger på det
Avatar billede themapplz Nybegynder
29. november 2005 - 00:47 #28
jamen det virkede jo. tusind tak! det havde jeg aldrig kunne brygge sammen det der! :)
Avatar billede 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.
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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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