Autor | Zpráva | ||
---|---|---|---|
Contador Profil |
#1 · Zasláno: 23. 7. 2014, 14:44:35
Ahoj ucim se MySQl a vytvarim novou databazi a pri vkladani dat do databaze me to pise: " Duplicate entry '1' for key 'PRIMARY' "
Mam dva soubory v jednom vytvarim databazi a druhym souborem vkladam data. Nevite prosim vas kde je chyba? Dekuji za odpoved 1.soubor $filmy = "CREATE TABLE movie( movie_id int(11) NOT NULL auto_increment, movie_name varchar (255) NOT NULL, movie_type tinyint(2) NOT NULL default 0, movie_year int(4) NOT NULL default 0, movie_leadactor int(11) NOT NULL default 0, movie_director int(11) NOT NULL default 0, PRIMARY KEY (movie_id), KEY movie_type(movie_type, movie_year) )"; $vysledky = mysql_query($filmy)or die (mysql_error()); $typyfilmu = "CREATE TABLE movietype( movietype_id int(11) NOT NULL auto_increment, movietype_label varchar(100) NOT NULL, PRIMARY KEY (movietype_id) )"; $vysledky = mysql_query($typyfilmu)or die (mysql_error()); $lide = "CREATE TABLE people( people_id int(11) NOT NULL auto_increment, people_fullname varchar (255) NOT NULL, people_isactor tinyint(1) NOT NULL default 0, people_isdirector tinyint(1) NOT NULL default 0, PRIMARY KEY (people_id) )"; $vysledky = mysql_query($lide)or die (mysql_error()); 2. soubor: $vlozit = "INSERT INTO movie(movie_id, movie_name, movie_type, ". "movie_year, movie_leadactor, movie_director)". "VALUES (1, 'Bozsky Bruce', 5, 2003,1,2),". "(2, 'Malery pana sikuly', 5, 1999,5,6),". "(3, 'Grand Canyon', 2, 1991, 4,3)"; $vysledky = mysql_query($vlozit)or die(mysql_error()); $typ = "INSERT INTO movietype (movietype_id, movietype_label)". "VALUES (1, 'SCI-FI'),". "(2, 'Drama'),". "(3, 'Dobrodruzny'),". "(4, 'Valecny'),". "(5, 'Komedie'),". "(6, 'Horror'),". "(7, 'Akcni'),". "(8, 'Detsky')"; $vysledky = mysql_query($typ)or die(mysql_error()); $lide = "INSERT INTO people (people_id, people_fullname,". "people_isactor, people_isdirector)". "VALUES (1, Jim Carrey, 1 ,0),". "(2, Tom Shadyac, 0,1),". "(3, Tom Cruise, 0,1),". "(4, Roberto de Niro, 0,1),". "(5, Kevin Costner, 1,0),". "(6, Harrison Ford, 0,1)"; $vysledky = mysql_query($lide)or die(mysql_error()); |
||
juriad_ Profil * |
#2 · Zasláno: 23. 7. 2014, 14:55:50
Contador:
Nespoustis druhy soubor podruhe? Mimochodem, v poslednim dotazu ti chybi apostrofy kolem jmen. Databaze se nerovna tabulka. Databaze obsahuje tabulky. |
||
mimochodec Profil |
#3 · Zasláno: 23. 7. 2014, 15:05:48
Contador:
„Ahoj ucim se MySQl a vytvarim novou databazi“ Máš nějaký důvod tvořit ji z php? |
||
Contador Profil |
#4 · Zasláno: 23. 7. 2014, 15:09:27 · Upravil/a: Contador
juriad:
poustel i vicekrat ale v myphpadmin jsem to smazal(pokazde ty tabulky movie,movietype,lide mam prazdne). Ty apostrofy mas pravdu dekuji mimochodec: ucim se to podle teto knizky http://knihy.cpress.cz/php5-mysql-apache.html a tam to tak je |
||
mimochodec Profil |
#5 · Zasláno: 23. 7. 2014, 15:17:31
Contador:
„ucim se to podle teto knizky ht>tp://knihy.cpress.cz/php5-mysql-apache.html a tam to tak je“ Tu knížku neznám, ale znám praxi. Doporučuji používat phpmyadmin nebo adminer a sql obsluhovat z něj. |
||
Contador Profil |
#6 · Zasláno: 23. 7. 2014, 15:27:08
nechapu z niceho nic to funguje...ze by ty apostrofy? Jinak diky moc :)
|
||
mimochodec Profil |
#7 · Zasláno: 23. 7. 2014, 15:30:17
A když se dívám na ty dotazy, tak bych doporučil tu knížku spíš nepoužívat. Sloupce s primárním ID je sice možné nazvat "people_id", ale k jakési "štábní kultuře" patří to, že se pojmenovávají prostě "id". Ještě horší je, jestli se tam doporučuje při vkládání řádků zadávat id a nenechat ho generovat databázi.
|
||
Marti_n Profil |
#8 · Zasláno: 24. 7. 2014, 14:39:29
Podľa mňa keď máš tabuľku pomenovanú people, tak stĺpce v nej by sa už nemali volať people_id, people_name, ale iba id a name. Logicky tabuľka ti určuje širšiu skupinu čo sa asi v nej nachádza a stĺpce ti pomenúvajú hodnoty tej širšej skupiny. Aspoň ja to tak robím, takže nezaručujem, že to tak má byť, ale podľa mňa je to tak fajn :)
|
||
popelka Profil * |
#9 · Zasláno: 24. 7. 2014, 18:05:03
Marti_n:
Nastáva otázka čo ak budeš mať uvediem príklad 30 a viac tabuliek, všade dáš len id ? V tých id-čkach sa skôr či neskôr budeš ťažko orientovať. Preto si myslím, že sa hodí použiť podľa mňa práve id zviazané s názvom tabuľky. |
||
Marti_n Profil |
#10 · Zasláno: 24. 7. 2014, 20:23:13
popelka,
Myslím, že problém to nie je a to z dôvodu, keď vyťahuješ naraz dáta z tabuliek, tak vyťahuješ spôsobom: people.id, news.id a nie takto: people.people_id, news.news_id. Čo je podľa teba prehladnejšie? Podľa mňa prvý príklad, ale je to len môj názor. |
||
popelka Profil * |
#11 · Zasláno: 24. 7. 2014, 20:57:11
Marti_n,
upresni mi prosím tvoj spôsob výberu všetkých dát naraz s tabuľky lebo ťa nejak nechápem. Ja použivám bežnú konštrukciu 1. select * from nazov_tabulky 2. select * from nazov_databazy.nazov_tabulky |
||
mimochodec Profil |
#12 · Zasláno: 24. 7. 2014, 21:10:33
popelka:
„upresni mi prosím tvoj spôsob výberu všetkých dát naraz s tabuľky lebo ťa nejak nechápem. Ja použivám bežnú konštrukciu“ To není zrovna ekonomický postup. Říkáš si tím většinou o více dat, než ve skutečnosti potřebuješ. |
||
Marti_n Profil |
#13 · Zasláno: 24. 7. 2014, 23:09:39
popelka
'SELECT * FROM tabulka', tento postup je zlý, keď nevyberáš všetky dáta z tabuľky čo nechceš vyberať asi v 95% SQL dotazov. Jasné sú výnimky, keď chceš vybrať všetko, ale tých je strašne málo. Zoberme si, že z tabuľky 'users' chceš vybrať stĺpec 'username' u užívateľa s 'id' 1, dotaz je 'SELECT username FROM users WHERE id=1 LIMIT 1' v tvojom prípade 'SELECT * FROM users WHERE id=1 LIMIT 1' by sme vyťahovali username, ale aj to 'id', ktoré nepotrebujeme pre nás dotaz. Nehovorím o tom keby tých stĺpcov bolo viac. Ďalej sa dostanem k tomu pomenuvaniu stĺpcov, keď si pomenúvaš stĺpce typu 'people_id' v tabuľke 'people', tak stačí to pomenovať iba 'id' v tabuľke 'people' . Meno tabuľky ti určuje širší rozsah čo vlastne obsahuje tabuľka a stĺpce ti určujú rozdelenie tej tabuľky, teda už širšieho obsahu. Teda ak sa neuspokojíš s dotazom 'SELECT id FROM people' (čo už napohlad vyjadruje čo chceš) , tak si môžeš dať 'SELECT people.id FROM people' (keď sa ti to zdá prehľadnejšie, tak môžeš aj takto a pritom sa stĺpec nemusí volať people_id) Tento druhý postup využiješ pri spájani tabuliek cez JOIN, teda takto: 'SELECT people.id, message.id FROM people JOIN message' tvoj dotaz by vyzeral 'SELECT people.people_id, message.message_id FROM people JOIN message'. Písal som to z mobilu, dúfam, že je to správne. |
||
popelka Profil * |
#14 · Zasláno: 25. 7. 2014, 06:07:02
mimochodec, Marti_n:
Myslím, že problém to nie je a to z dôvodu, keď vyťahuješ naraz dáta z tabuliek, tak vyťahuješ spôsobom..... ja som túto vetu pochopil ako výber všetkých stĺpcov z tabulky preto som použil "*" samozrejme s vami oboma súhlasim je lepšie si vymenovať len tie stĺpce s ktorými budem ďalej pracovať. Tento druhý postup využiješ pri spájani tabuliek cez JOIN, teda takto: 'SELECT people.id, message.id FROM people JOIN message' tvoj dotaz by vyzeral 'SELECT people.people_id, message.message_id FROM people JOIN message'. nestačilo by napísať SELECT a.people_id, b.message_id FROM people a JOIN message b
Je to len čisto môj názor a môj zvyk samozrejme každý sme zvyknutý na niečo iné. ak sa vrátim k bodu [#8] skúsim použiť zápis tabuliek pre tvoj selekt schválne si to skús u seba : tab1 people id(PK)|name| id (FK)(akoze id_message ) tab2 message id|mesage| |
||
Marti_n Profil |
#15 · Zasláno: 25. 7. 2014, 08:10:33
Jasné, že sa skončí chybou, keď máš 2 rovnaké názvy stĺpcov v tabuľke, ale povedz mi prečo by si mal mať v tabuľke people kde máš ľudí mať ešte id message? Skôr som za riešenie: 1) tabuľka 'people' (id, username, password...) 2) tabuľka 'messages' (id, people_by, people_for).. 3) tabuľka 'messages_text' (id, text)
|
||
Snipo Profil |
#16 · Zasláno: 25. 7. 2014, 12:43:25
Sice to netýka problému ale môže mi niekto prosím vysvetliť, čo robí to
KEY movie_type(movie_type, movie_year) ? Poprípade ako to urobiť v phpmyadmin :)
|
||
juriad Profil |
#17 · Zasláno: 25. 7. 2014, 12:55:37
http://stackoverflow.com/questions/924265/what-does-the-key-keyword-mean
Je to INDEX. Slouží k urychlení vyhledávání v tabulce při dotazech, které mají v podmínce dané sloupce. V tomto případě urychlí dotazy, které mají podmínku jen na move_type, nebo na move_type a movie_year. A podle databázové teorie klíč - key znamená množinu atributů, které unikátně identifikují každý záznam. Což znamená něco úplně něco jiného. |
||
popelka Profil * |
#18 · Zasláno: 25. 7. 2014, 14:30:23
Marti_n:
Ja som načrtol situáciu 1:N, čiže každý užívatel môže napísať "N" správ, no každá správa patrí len práve tomu užívatelovi, ktorý ju napísal. Neuviedol som práve štastný príklad. [#15] U teba nevidím použitý cudzí klúč v tých 3 tabulkách a v momente ak budeš chcieť použiť id ako cudzí klúč (väčšina prípadov z mojich skúseností) tvoj návrh sa stretne s duplicitou. |
||
Časová prodleva: 2 měsíce
|
|||
Dusann Profil |
mimochodec:
„Sloupce s primárním ID je sice možné nazvat "people_id", ale k jakési "štábní kultuře" patří to, že se pojmenovávají prostě "id".“ Marti_n: „Podľa mňa keď máš tabuľku pomenovanú people, tak stĺpce v nej by sa už nemali volať people_id, people_name, ale iba id a name. Logicky tabuľka ti určuje širšiu skupinu čo sa asi v nej nachádza a stĺpce ti pomenúvajú hodnoty tej širšej skupiny“ „Myslím, že problém to nie je a to z dôvodu, keď vyťahuješ naraz dáta z tabuliek, tak vyťahuješ spôsobom: people.id, news.id a nie takto: people.people_id, news.news_id. Čo je podľa teba prehladnejšie? Podľa mňa prvý príklad, ale je to len môj názor.“ --- No ale v určitých situáciách je plné pomenovanie IDčiek výhodnejšie, než iba ID. Napríklad máme tabuľku employees (má stĺpec id a job_id ako FK) a tabuľku jobs (má stĺpec job_id). Ak použijeme join kde chceme spojiť employees s jobs cez job_id, tak stačí použiť USING(job_id), čo sa podľa mňa číta oveľa pohodlnejšie, než by sme mali toto: tabuľka employees (má stĺpec id a job_id ako FK), tabuľka jobs (má stĺpec id) V tomto prípade musíme pre join použiť ON a definujeme porovnávanie obidvoch stĺpcov- job_id = jobs.id |
||
Časová prodleva: 10 let
|
0