Autor Zpráva
Contador
Profil
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 *
Contador:
Nespoustis druhy soubor podruhe?
Mimochodem, v poslednim dotazu ti chybi apostrofy kolem jmen.
Databaze se nerovna tabulka. Databaze obsahuje tabulky.
mimochodec
Profil
Contador:
Ahoj ucim se MySQl a vytvarim novou databazi

Máš nějaký důvod tvořit ji z php?
Contador
Profil
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
Contador:
ucim se to podle teto knizky http://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
nechapu z niceho nic to funguje...ze by ty apostrofy? Jinak diky moc :)
mimochodec
Profil
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
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 *
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
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 *
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  
alebo
2. select * from nazov_databazy.nazov_tabulky
mimochodec
Profil
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
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 *
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 ) 
-skončí to chybou ak tam dám len id aj toto je dôvod prečo sa používa id spojené s názvom tabulky

tab2
message
id|mesage|
Marti_n
Profil
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
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
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 *
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.
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

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0