Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: SQL -päivitys

Sivun loppuun

mmikko [23.01.2016 01:07:56]

#

Tere!

Oon yrittänyt tässä väkertää pientä toimintoa omaan php projektiin, mutta toistaseksi ei oo onnistanut.

Tietokannasta poistuu aika-ajoin tietoa. Rivillä on id lisäksi nro-kenttä eli kantaan ku tulee tavaraa niin tuo numero kasvaa sitä mukaa 1,2,3,4,5 etc. Ja luonnollisesti ku poistuu niin esim. 1,4,5 jää jäljelle. Nyt pitäs saada tuo nro-kenttä starttaamaan taas ykkösestä etiä päin niin paljon ku rivejä taulussa on. Minkälaisella komennolla saisin käskytettyä?

Kiitos!

Grez [23.01.2016 06:23:28]

#

Jos tauluun ei ole relaatioita, niin siten voisi olla yksinkertaisinta kopioida tiedot toiseen tauluun, poistaa alkuperäisestä taulusta kaikki rivit ja nollata laskuri sekä kopioida rivit takaisin.

Jos tauluun sen sijaan viittaa muita tauluja, niin sitten homma on huomattavasti hanakalampi. Kätevin ratkaisu voi sitten rippua paljonkin käyttämästäsi tietokantamoottorista.

Suurin kysymys on kuitenkin, että "miksi?"

mmikko [23.01.2016 10:13:49]

#

Joo lueskelin tuosta, että noin on mahdollista tehdä. Taulussa ei ole relaatioita. Tarvitsen juoksevaa numerointia projektissa.

id nro
2 1
44 2
564 3

Ehkäpä tuumailen hetken, voisinko totetuttaa tuon jollain muulla tavalla. Alun perin ongelma oli siinä, että mulla on formi, jolta pistetään tavaraa kerralla monta riviä tietokantaan.

VALUES'  . implode(',',$query_row));

tuossa siis menee kaikki tietokantaan mitä formilla, mutta en saanut/osannut käskyttää sitä niin, että jos joku tietty kenttä on tyhjä niin se ei sisältyisi tuohon $query_row:n. Eli nyt sinne menee kaikki ja insertin jälkeen deletoidaan rivit jossa joku tietty kenttä on tyhjä.

Mutta joo varmaan monelle yksinkertainen juttu.

Lisäys: tuli mieleeni, että voinhan tulostaa juoksenvan numeroinnin vasta sitten kun taulusta hajetaan tieto.

groovyb [23.01.2016 10:47:32]

#

Lue kaikki rivit taulusta =>
sorttaa saadut rivit id -numeron mukaan =>
looppaa sortatut rivit =>
loopin sisällä, inkrementoi nro kentän arvoa alkaen ykkösestä, ja päivitä rivitieto tietokantaan.

Metabolix [23.01.2016 11:05:30]

#

Reaaliaikaisesti tuota saa ylläpidettyä, kun poiston yhteydessä aina päivittää kaikki poistettavaa suuremmat rivinumerot yhtä pienemmiksi.

SELECT x FROM taulu WHERE id = 123;
DELETE FROM taulu WHERE id = 123;
UPDATE taulu SET x = x - 1 WHERE x >= poistettu ORDER BY nro ASC;

Tämän automatisoinnissa auttaisi AFTER DELETE -triggerin käyttö, joka toimisi kaiketi tähän malliin:

CREATE TRIGGER rivinumeron_korjaus
AFTER DELETE ON taulu
FOR EACH ROW
  UPDATE taulu SET x = x - 1 WHERE x > OLD.x

Grez [23.01.2016 11:23:43]

#

Jos projektissa tarvitsee juoksevaa numeroa, niin eikö se olisi järkevää tehdä näkymänä? Useimmissa tietokannoissa saa "laskettua" tiedon, että monesko rivi on.

Edit, kas olit jo itsekin ajatellut tuota (lisäyksenä)

Groovyb:n ja Metabolixin vinkit ei välttämättä ole mahdollisia jos käytössä on kanta, jossa autoincrement/identity tyyppistä kenttää ei pysty päivittämään.

mmikko [23.01.2016 22:07:42]

#

Kiitos, homma ratkesi sitten helpommin kuin aluksi ajattelin.

groovyb [23.01.2016 23:30:48]

#

Grez,tuossahan mainittiin että id kentän lisäksi on nro -kenttä, joka piti uudelleensortata, ei itse id kenttä. Tietty nro kenttäkin voi autoincrementillä olla, en vain keksi miksi pitää kaksi samaa arvoa rivillä, jos molemmat toimivat yksilöitynä tunnuksena ja samalla arvolla.


Sivun alkuun

Vastaus

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

Tietoa sivustosta