na początku chciałem zaznaczyć, że jestem dosyć nowy i jeszcze do końca niekumaty (prawdopodobnie ze względu na mój wiek). Tworzę sobie nowy projekt oparty na Yii. Przyszła pora na sprawdzenie tego co wyknociłem w pliku /protected/data/schema.mysql.sql - z ciekawości porównałem to z dołączonym plikiem bazy w demo bloga. I teraz tak, struktura blogowej bazy danych ma takie linijki:
CONSTRAINT FK_post_author FOREIGN KEY (authorId)
REFERENCES User (id) ON DELETE CASCADE ON UPDATE RESTRICT
Próbowałem szukać informacji na ten temat w dokumentacji mysql’a, jednak poległem.
Tu moje pytania:
o co chodzi z tym CONSTRAINT FK_post_author i czy ma to jakiś wpływ na działanie aplikacji?
ON UPDATE RESTRICT, z czym się to je?
czy wykluczając CONSTRAINT (alias) i ON UPDATE RESTRICT z mojego pliku będę zmuszony robić jakieś ‘myki’ podczas pisania aplikacji?
I jeszcze z innej beczki:
czy jest jakaś zasadnicza różnica między używaniem createCommand("suchy sql + zmienne") a używaniem $criteria?
W dokumentacji jest trochę suchych danych i opis składni. Żeby zrozumieć klucze zewnętrzne (albo klucze obce jak też się je czasem nazywa) dobrze przeanalizować jakiś przykład. Tutorial bloga w naszym Yii coś tam da, ale polecam na przykład to:
przykład to banalny, ale przynajmniej będziesz wiedział o co chodzi.
Mówiąc w skrócie.
jest to definicja klucza obcego i może mieć bardzo duży wpływ na działanie aplikacji.
Z kluczami obcymi, rzecz jasna . Jest to wyjaśnione w dokumentacji mysql.
Raczej tak. Klucze zewnętrzne mają za zadanie utrzymać spójność danych przechowywanych w bazie. Na przykład, jeżeli masz post w blogu i szereg komentarzy do tego posta, to usuwając post chcesz aby komentarze z nim powiązane zostały także usunięte i nie zaśmiecały bazy danych. Do tego właśnie służą klucze obce. Jeżeli ich nie użyjesz, to będziesz musiał usunąć te komentarze ręcznie, tzn. w php.
Trzeci podpunkt z podręcznika MySQL, dział o kluczach obcych:
Cytat z podręcznika MySQL, dział o tworzeniu tabel http://dev.mysql.com…eate-table.html
Dwie pierwsze tabele z bloga:
[sql]CREATE TABLE User
(
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(128) NOT NULL,
password VARCHAR(128) NOT NULL,
email VARCHAR(128) NOT NULL,
profile TEXT
);
CREATE TABLE Post
(
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(128) NOT NULL,
content TEXT NOT NULL,
contentDisplay TEXT,
tags TEXT,
status INTEGER NOT NULL,
createTime INTEGER,
updateTime INTEGER,
commentCount INTEGER DEFAULT 0,
authorId INTEGER NOT NULL,
CONSTRAINT FK_post_author FOREIGN KEY (authorId)
REFERENCES User (id) ON DELETE CASCADE ON UPDATE RESTRICT
);
[/sql]
Z tego wynika, że kolumna authorId w tabeli Post zostanie zindeksowana automatycznie.
Kolumna id w tabeli User jest kluczem podstawowym, co oznacza, że jest indeksowana.
Dobrze jest taki przykładowy kod sql zaimportować do bazy i potem sprawdzić co i jak powstało i gdzie. Mam nadzieję, że korzystasz z narzędzi typu phpMyadmin albo MySQL Workbench a nie tylko z konsoli.