Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: SQL: juokseva nro Mysql kantaan

tohelo [01.06.2005 10:07:48]

#

Virhe SQL-lause:
ALTER TABLE `Tauluxx` ADD `Jrjuoksevanro` INT NOT NULL AUTO_INCREMENT MySQL ilmoittaa:
#1075 - Incorrect table definition; There can only be one auto column and it must be defined as a key


Automaattinen juokseva nro pitäisi määritellä avaimeksi,
mutta avaimena on jo id (reknro tai y-tunnus)

Voisko toi juokseva nro olla secondary key?
(ei löydy ainakaan Phpmyadmin valmiista toiminnoista)

kentän alustus onnistuu ehkä php:stä käsin tällä
sql-lauseella jonka sisemmässä osassa käydään selectillä
kaikki taulun rivit läpi

Update taulu Juoksevanro = $laskuri + 1
SELECT * FROM taulu;

http://www.frodos.fi/kurssi/sql/tab_insfromtab.htm


tosiaan näyttäis siltä että auto_increment määritys käy vain avainkentille


Phpmyadmin:ssa voi kentälle antaa ohjatuilla toiminnoilla seuraavat määritykset:
ensisijainen, indeksi, uniikki

Phpmyadmin ei näyttäis tuntevan käsitettä secondary key

Juoksevan numeron määrittäminen primary key:ksi ei käy,
koska nykyinen avainkenttä rek.nro tai y-tunnus
estää käyttämästä samaa avaintietoa kuin kerran
ja näin pitääkin olla

litra [03.06.2005 16:57:33]

#

Tässä tapauksessa täytyy auto incrementti (kuten sen pitäisi aina) tehdä ohjelman koodissa vapaasti valinnaisella tavalla... tai sitten ollain makrolla jos mysql:stä löytyy..en tiiä

peran [04.06.2005 19:57:04]

#

Mulla tulee mieleen purkkaratkaisu, joka saattaa olla nopeampi kuin käydä kaikki rivit läpi.
Tee aputaulu, jossa primary keynä on auto_increment, ja toisena kenttänä id (reknro tai y-tunnus).

Sitten vaan lisäät kaikki id:t taulusta aputauluun, ja kun tarvitset aputaulun auto_incrementin kautta käytät sitä yhdistämällä taulut selectillä.

Toivottavasti ymmärsit. (En ole pitkään aikaan mitään tehnyt SQL:llä, joten saat sinne päin olevat koodit, vain jos pyydät).
Tai yritetään, jos vaikka osaisin.

// Aluksi luodaan taulu jotenkin näin (Yritin tavata MySQL opasta en tiedä menikö oikein).
CREATE TABLE aputaulu
(
 nroAuto INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (nroAuto),
 id2 VARCHAR(12) NOT NULL
);

// Sitten laitetaan taulun id:t aputauluun, ja ilmeisesti auto_incrementti huolehtii numeroinnista
INSERT INTO aputaulu (id2) SELECT id FROM taulu;

// Lopuksi tulostetaan taulujen yhdistelmä
SELECT * FROM taulu,aputaulu WHERE taulu.id=aputaulu.id2;

// VAROITUS EN VASTAA KOODINI TOIMIMISESTA, mutta kyllä siitä ideaa saa ottaa

Empäs ota kantaa onko tuollainen turha ylimääräinen taulujen yhditämänen liian hidas, mutta on jokin (purkka)ratkaisu.

tohelo [06.06.2005 09:49:45]

#

kiitoksia ehdotuksesta!

tein tässä vaiheessa erillisen
alustusohjelman (skriptin)
juoksevanro.php
tai oikeammin muokkasin sen
ohjelmasta joka listaa
nimi kentät linkkeinä

juoksevan numeron päivättää lause
on mysql_query funktion syöttötietona

<?php

       $host="db.dataxx.fi";
       $user="xx.info";
       $password="xxxxxx";
       $database="testikanta";



  // otetaan yhteys tietokantaan
  mysql_pconnect($host,$user,$password)
    or die("Tietokantayhteys ei toimi, kokeile myöhemmin!");
  mysql_select_db($database);



    // haetaan lista
    echo "<p>\n";
    $kysely =
      "SELECT Jrid, Jrnimi, Jrjuoksevanro FROM Jarjesto".
      "   ORDER BY Jrnimi";
    echo "<p class=ylaotsikko>Valitse järjestö klikkaamalla linkkiä</p>";
    if ($tulos = mysql_query($kysely)) {
      $laskuri = 1;
      while (list($id, $nimi, $nro) = mysql_fetch_row($tulos)) {
//        echo "Juokseva nro päivitys! ";
        mysql_query("UPDATE Jarjesto SET Jrjuoksevanro = $laskuri WHERE Jrid = $id ");
        $laskuri++;
        echo "<a href=\"jarjestolista.php?Jrid=$id\" class=leipis target=_blank>$nimi $nro</a><br>\n";
      }
    } else {
      echo "Listan haku ei onnistunut!";
    }
    echo "</p>\n";
?>

Mod. edit: Lisäsin kooditagit

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta