Autor Zpráva
regy
Profil
Zdravím,
lze v myslq propojit dvě tabulky tak, aby v tabulce 2 byl sloupec s hodnotou buď id z tabulky 1 nebo nic/0/apod s tím, že při smazání řádku v tabulce 1 by se smazali i záznamky v tabulce 2 navázány na tento řádek (cascade)? Jedná se mi o to, jak realiovat buď spojení s tabulkou 1 nebo nic.

Díky
juriad
Profil
CREATE TABLE parent (id INT NOT NULL,
                     PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE child (id INT, parent_id INT,
                    INDEX par_ind (parent_id),
                    FOREIGN KEY (parent_id) REFERENCES parent(id)
                      ON DELETE CASCADE
) ENGINE=INNODB;
vypůjčeno z http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

stačí jen v definici sloupce parent_id neuvést NOT NULL
regy
Profil
juriad:
Děkuju
Prokop
Profil *
Zdravím,
mám dotaz ke stejnému tématu, zkoušel jsem se dívat na ten odkaz, ale nedokážu si vydedukovat z toho co potřebuji.

1) children musi mit nazev sloupce ve tvaru "tabulka_sloupec" aby se dokazal spojit s druhou tabulkou?

2) potrebuji vyresit propojeni tabulky "messages" sloupcu "to_id" a "by_id" s tabulkou "user" sloupcem "id", jak na to? jde to? v PhpMyAdmin (dale jen PMA) mi to hazi chybu 1452, kdyz chci obema sloupcum nastavit klic

3) jde nastavit vice "children" jednomu rodici? napr tabulky "roles.user_id", "messages.user_id", "forum.user_id" maji rodice v "user.id"?

4) co je v PMA v "Struktura>Zobrazit relace" moznost "Interni relace" a "Omezeni ciziho klice"? Jaky je v tom rozdil?

5) jde propojit tabulky nasledujicim stylem "messages.identita2_id">"identita2.user_id">"user.id"?



Díky za rady, v SQL jsem se s tímto setkal poprvé a nenašel jsem žádný návod, který by mi toto všechno zodpověděl jako pro blbce.. :)
Kajman
Profil
1) ne
2) uděláte postupně dva klíče (musíte mít innodb tabulky)
3) ano
5) ano, pokud nad sloupcem user_id je primární klíč v tabulce identita2
juriad
Profil
1) používá se to pro přehlednost, aby tě hned trklo, že je to cizí klíč
2)
CREATE TABLE user
  (
     id   INT NOT NULL,
     name VARCHAR(32),
     PRIMARY KEY (id)
  )
engine=innodb;

CREATE TABLE messages
  (
     id    INT,
     to_id INT,
     by_id INT,
     INDEX to_ind (to_id),
     INDEX by_ind (by_id),
     FOREIGN KEY (to_id) REFERENCES user(id),
     FOREIGN KEY (by_id) REFERENCES user(id)
  )
engine=innodb;  
ty indexy jsou tam pro rychlejší vyhledávání, protože typický dotaz bude:
SELECT * FROM messages WHERE to_id = $to_id -- případně varianta s by_id

3) dokonce je to velice vhodné, přece nebudeš mít bambilion tabulek user
5) ano, select pak vypadá:
SELECT * FROM messages JOIN identita2 ON messages.identita2_id = identita2.id JOIN user ON identita2.user_id = user.id WHERE user.name = "Franta Vomáčka"
To, že tabulce uvedeš PRIMARY KEY, INDEX, FOREIGN KEY je jen nápověda pro databázi, jak má tabulku spravovat a hlídat konzistenci dat -- nemůžeš třeba vložit zprávu neexistujícímu to_id, databáze ti to nedovolí. Úplně stejné dotazy bys mohl provádět bez klíčů a indexů, jen by byly hóódně pomalejší.
Prokop
Profil *
juriad:
Díky moc za odpověď :) To je to co jsem požadoval, napsat to jako pro de*ila.
Díky ;)

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