Peršokti į turinį
  • ŽAIDIMAI
  • , ŽAIDIMAI
  • ŽAIDIMAI

[Pamoka]MySQL lentelių ryšiai - foreign keys


bebras

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 3746 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Recommended Posts

Sveiki, jau ne kartą kitose savo MySQl temose žadėjau aprašyti foreign keys, bet taip niekada ir neprisiruošiau.. Bet šiandie pamatęs dar vieną tema kur saugomi ginklai "ginkas1,ammo1,ginklas2,ammo2" pagaliau nusprendžiau sutvarkyti šitą reikalą.

 

 

Įžanga

 

Kas tai yra?Trumpai tai yra būdas sukurti duomenims kurie priklauso nuo kitų(esančių kitoje lentelėje). 

Kodėl to reikia? Jums įprasta kurti kiekvienam galimam ginklui/tr priemones komponentui ir pnš po atskirą stulpelį, tačiau didžiąją laiko dalį jie lieka tušti. Šiuo būdų eilutės bus tik tada kai jų reikia, o lentelė bus sudaryta vos iš 3-4 stulpelių!

 

 

MySQL lentelių tvarkymas

 

Kad būtų paprasčiau suprasti kas tai yra ir kaip veikia(pabaigoje parodysiu kaip tai padaryti iš MySQL pusės) naudosiu išgalvotą situaciją: žaidėjų lentelė nuo kurios priklausys ginklai.

 

 

Tarkim mūsų žaidėjų lentelė,kuri vadinsis "zaidejai" turi 3(dėl paprastumo) stulpelius, tebunie tai "Id", "Vardas" ir "Slaptažodis". Kuriant stulpelį "Id" reikėtų pažymėti A_I(tai automatiškai numeruos šį stulpelį) ir "Index" nustatyti į "Primary Key". Kitų stulpelių tipai mums dabar nesvarbūs.

 

Dabar lentelė "ginklai", sukursime 4 stulpelius(daugiau ir nereikės):

Numeris - pažymėkite A_I. (Šiaip tai nėra reikalinga, bet be unikalaus stulpelio negalėsite keisti/trinti duomenų)

Savininkas - pasirinkite "Index" "Index"(du kartus parašiau ne dėl klaidos)

"GinkloId" - Įprastas skaičius, bet siūlyčiau tipą "TINYINT", kadangi ginklo ID niekada nebus didesnis nei 46

"Amunicija" - įprastas skaičius, bet siūlyčiau "SMALLINT", nes "INT" per didelis.

(Dėl duomenų tipų ir jų galimų reikšmių žiūrėti čia.)

 

Gerai, turime dvi lenteles. Dabar sukurkime ryšį. Yra du būdai(parodysiu abu), jie duoda tą patį rezultatą:

 

1.Siunčiant užklausą. Atsidarykite savo duomenų bazėje "SQL" puslapį. Jame rašome:

ALTER TABLE ginklai ADD FOREIGN KEY(Savininkas) REFERENCES zaidejai(Id) ON DELETE CASCADE ON UPDATE CASCADE

Ir siunčiame. "ON DELETE CASCADE......." tai reiškia kad ištrynus šią eilutę norime kad kitos tiesiog pasitrauktų (nelikto tuščios eilutės).

 

2. phpMyAdmin paspauskite ant savo "ginklai" lentelės, pasirinkite "Structure" ir po struktūra spauskite "Relation e", tada paprasčiausiai "Savininkas" eilutei parinkite "zaidejai" "Id".

 

 

Ir viskas! Toliau seks Pawn kodas. 

 

 

 

Kaip tai atrodo Pawn

 

 

Pawn'e, kai jau esate užkrovęs įprastą informaciją iš lentelės "zaidejai", siųskite tokią užklausą:

SELECT * FROM ginklai WHERE Savininkas = Zaidejo_ID_Is_Lenteles_Zaidejai

Atitinkamai nuo jūsų naudojamo MySQL plugin versijos apdorokite duomenis:

format(query,sizeof(query),"SELECT * FROM ginklai WHERE Savininkas = %d",savininko_id);


//R7+
mysql_function_query(connection_Handler,query,"OnWeaponLoad","i",playerid); //R33+ keičiasi į "mysql_tquery"


forward OnWeaponLoad(playerid);
public OnWeaponLoad(playerid)
{
   new rows,fields;
   cache_get_data(rows,fields);
   if(!rows) return 1; //R33+ galite šį kodą keisti į cache_get_row_count
   for(new i; i < rows; i++)
   {
        GivePlayerWeapon(playerid,cache_get_row_int(i,2),cache_get_row_int(i,3)); //cache_get_row_int pridėta R8.
   }
   return 1;
   

}


//R6 ar žemesnės versijos naudotojams

mysql_query(query);
if(!mysql_num_rows()) return 1;
for(new i; i < mysql_num_rows()
{
  new tmp[2][8];
  mysql_fetch_field_row(tmp[0],"GinkloId");
  mysql_fetch_field_row(tmp[1],"Amunicija");
  GivePlayerWeapon(playerid,strval(tmp[0]),strval(tmp[1]));

}

Saugoti ginklus galima taip:

new weapons[13[2],query[];
for(new i; i < 13; i++)
{
 GetPlayerWeaponData(playerid,weapons[i][0],weapons[i][1])
 if(weapons[i][0] != 0) //jeigu turi ginklą
 {
   format(query,sizeof(query),"INSERT INTO ginklai(Savininkas,GinkloId,Amunicija)VALUES(%d,%d,%d)",zaidejo_id,weapons[i][0],weapons[i][1]);
   //priklausomai nuo mysql plugin
   mysql_tquery(connection_handler,query,"","");
   mysql_function_query(connection_handler,query,true,"","");
   mysql_query(query);
 }
}

Tai tiek, kaip visada priimu vertinimus, komentarus! Ir jeigu turite klausimų, klauskit drąsiai bandysiu į visus juos atsakyti!

Nuoroda į komentarą
Dalintis per kitą puslapį

  • Parašė po 2 savaičių...

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 3746 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Prisijungti prie diskusijos

Palikti atsakymą galite iš karto, o užsiregistruoti vėliau. Jeigu jau turite paskyrą mūsų forume, Prisijunkite.

Svečias
Atsakyti šioje temoje...

×   Įklijuotas tekstas turi teksto formatavimą.   Pašalinti teksto formatavimą

  Galimi tik 75 veidukai.

×   Nuoroda buvo automatiškai įterpta.   Įterpti nuorodą paprastai

×   Jūsų ankstesnis pranešimas buvo atkurtas.   Išvalyti redaktorių

×   Jūs negalite įkelti nuotraukas tiesiogiai.Įkelkite arba įdėkite nuotraukas iš URL.

  • Šiame puslapyje naršo:   0 nariai

    • Nėra registruotų narių peržiūrinčių šį forumą.

Skelbimai


×
×
  • Sukurti naują...