Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySql primary key - foreign key

JimProfit [02.03.2011 10:35:41]

#

Terve

Voisko joku auttaa minua tossa primary keyn ja foreign keyn ymmärtämisessä, miten tämä tässä tapauksessa olisi käytännössä paras tehdä.

Mulla on nettisivut jossa käyttäjä syöttää nimen ja ajoneuvon tiedot. Oman nimen käyttäjä syöttää tietysti vain kerran, mutta hän voi syöttää useampia ajoneuvoja, esim. nimi: Jukka ajoneuvot: bmw ssk-123, mersu bbd-442 ja jne...

Olen tehnyt mysql tietokantaan kaksi taulukkoa, nimi ja auto -taulukot mihin syötetyt tiedot menee:

nimi-taulu:
Id int auto_increment primary key
Nimi varchar

auto-taulu:
Id int auto_increment primary key
Omistaja int (tästä forein key nimi.Id:hen)
Rekisterinumero varchar
Merkki varchar

Tuon auto-taulun tein seuraavalla komennolla:

CREATE TABLE testi2.auto
(
Id int auto_increment,
Omistaja int,
rekisteri varchar(10),
merkki varchar(20),
PRIMARY KEY(Id),
FOREIGN KEY (Omistaja) REFERENCES nimi (nimi_id) on delete cascade
)TYPE=INNODB;

Ongelma mulla on tässä tämä auto-taulun Omistaja-kenttä, eikö siinä pitäisi olla sama arvo kuin nimi-taulun ID kentässä ? Eli yksi nimi ja esim. kaksi ajoneuvoa samalla henkilöllä, niin niissä kahdessa ajoneuvossa pitäisi olla samat numerot henkilön id:ssä, jotta jonkilainen yhteys tauluilla olisi?

Nyt se omistaja-kenttä jää null ksi kun tauluihin syöttää tietoa, eli yhteyttä tauluilla ei ole.
Mikä tähän olisi järkevin ratkaisu syöttää auto-tauluun, omistaja-kentään oikea arvo ?

Teuro [02.03.2011 10:51:04]

#

No mutta jos siihen kenttään ei syötä tietoa, niin ei se tieto siihen kenttään itsestään kyllä tule. Järkevin tapa syöttää kenttään jokin arvo on tehdä sellainen kysely, jossa kenttään laitetaan jokin arvo.

JimProfit [02.03.2011 10:55:40]

#

Ok, kiitos vinkistä.

Tuota asiaa mietinkin tossa. Jos muutan auto-taulun omistaja kentän varchariksi ja syötän siihen nimen, mikä on tässä tapauksessa aina uniikki arvo, niin sittenhän se pitäs toimia oikein kun molemmissa tauluissa on sama nimi millä ne yhdistää.

Pitää samalla miettiä tota nimi-taulun primary key uusiksi.

Othnos [02.03.2011 11:01:05]

#

MySQL 5.5 Reference Manual Tuolla on englanniksi tietoa.

Taulun luonnissa pistää silmään

REFERENCES nimi (nimi_id)

Nähdäkseni sinulla ei ole nimi-taulussa kenttää nimi_id vaan pitäisi olla pelkkä id.

JimProfit kirjoitti:

Nyt se omistaja-kenttä jää null ksi kun tauluihin syöttää tietoa, eli yhteyttä tauluilla ei ole.
Mikä tähän olisi järkevin ratkaisu syöttää auto-tauluun, omistaja-kentään oikea arvo ?

Jos luonnin yhteydessä haluat tallentaa henkilölle autoja voit hakea tallennetun henkilön autoincrement id:n esim. mysql_insert_id-funktiolla.

Teuro [02.03.2011 12:16:20]

#

JimProfit kirjoitti:

Jos muutan auto-taulun omistaja kentän varchariksi ja syötän siihen nimen, mikä on tässä tapauksessa aina uniikki arvo, niin sittenhän se pitäs toimia oikein kun molemmissa tauluissa on sama nimi millä ne yhdistää.

Pitää samalla miettiä tota nimi-taulun primary key uusiksi.

No ei missään ihmeen nimessä näin! Pidä vaan se nimi-taulun primary key ihan vaan numeerisena auto_increment määrellä. Paremmin se toimii numeroilla, kun kirjoitusvirheiden määrä vähenee. Sama arvohan noihin tauluihin pitää laittaa joka tapauksessa.

Kirjoitukseni pointti oli se, että kun lisäät uuden auton, niin sinun pitää lisäyksen yhteyden itse huolehtia oikeasta omistajasta. Ei se kanta sitä osaa lisätä automaagisesti. Eli jos lisäät uuden auton näin:

"INSERT INTO autot (rekisteri, merkki) VALUES('UAF-444', 'Chrysler')";

Tällä koodilla omistajaksi tulee (tai siis ainakin pitäisi tulla) NULL, koska et ole sitä taulun luonissa kieltänyt. Sen sijaan jos teet lisäyksen omistajan kanssa, niin omistaja tulee ihan oikein.

Grez [02.03.2011 13:09:49]

#

No ei minusta ole mitenkään väärin käyttää foreign keynä jotain muuta kuin numeroa. Silti aika pieni vaiva ottaa se identity. Käyttäjätunnus primary keyksi voi olla ihan hyvä vaihtoehto ja minusta joku sääntö että primary key pitäisi olla int eikä varchar on ns. "premature optimization". Suorituskykyero on merkityksetön.

Tuossa täytyy sitten muistaa varautua siihen, että käyttäjätunnus voi olla käytössä eikä kantaan sen takia voi tallentaa mitään ennen kuin valitaan toinen käyttäjätunnus.

JimProfit [02.03.2011 13:55:53]

#

Joo, kyllä mä näillä tiedoilla pääsen eteenpäin.

Vastaus

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

Tietoa sivustosta