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 ?
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.
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.
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.
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.
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.
Joo, kyllä mä näillä tiedoilla pääsen eteenpäin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.