Jak utworzyć jeden do wielu w SQLITE3?


Jak utworzyć jeden do wielu w SQLITE3?
Mam 2 stoły:
Mans:
_id name
1 antony
2 fred

i
point
_id date point
1 23 77
24 99 2 25 78
5 0

Nie znam składni SQL, proszę o pomoc.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Sądząc po tym, co napisał yamkrillin:
CREATE TABLE (points) points_id INT
FOREIGN KEY(man_id) REFERENCES mans(PrimaryKeyField)
ON DELETE CASCASDE ON UPDATE CASCASDE

Oto przykład z prawdziwego świata. Załóżmy, że masz ludzi, którzy polecają Ci firmę: Twoi pracownicy, Twoi znajomi, lokalne firmy, w których się reklamujesz, itp. Klienci, którzy przychodzą, nazywani są firmami „polecającymi”. Każda osoba liczy się jako tylko jedno polecenie, ale osoba polecająca może łączyć się z wieloma poleceniami (na przykład pracownik może polecić 20 nowych klientów; pracownik jest Twoim poleceniem, a pracownik wystawił 20 poleceń). Masz więc 1 osobę polecającą i 20 skierowań (jeden do wielu):
CREATE TABLE referal( 
referal_id INTEGER UNIQUE NOT NULL PRIMARY KEY,//A customer can only be 1 referal.
referal_method TEXT,//How were they refered? By phone?
referer_id INTEGER ,//Who refered them?
FOREIGN KEY(referer_id) REFERENCES referer(referer_id));//Trace more about referer.

Jest teraz całkowicie możliwe, że więcej niż jedna osoba łączy się ze skierowaniem, ale myślę, że standardową praktyką biznesową jest kompensowanie tylko jednego polecenia. W ten sposób nigdy nie musisz podawać dwóch referencji. Zawsze będzie to relacja 1 do 1 lub 1 do wielu; więc musisz uczynić to tabelą 1 do wielu. Nie jestem zbyt dobry w sprawach CASCADE, ale spróbuję dowiedzieć się, jak to pasuje.
Na pierwszy rzut oka wydaje się, że
AKTUALIZUJ KASKADĘ ON USUŃ KASKADĘ
nie jest uwzględnione w mojej odpowiedzi, ponieważ usunięcie ostatniego skierowania nie powinno usuwać strony odsyłającej.
Rozważać

inny przykład
http://publib.boulder.ibm.com/ ... 2.htm
:
CREATE TABLE all_candy 
(candy_num SERIAL PRIMARY KEY,
candy_maker CHAR(25));CREATE TABLE hard_candy
(candy_num INT,
candy_flavor CHAR(20),
FOREIGN KEY (candy_num) REFERENCES all_candy
ON DELETE CASCADE)

Jeśli usuniesz cukierki z tabeli
hard_candy
, usuniesz je również z tabeli
all_candy
, ponieważ są to cukierki i jeśli rodzaj cukierków się zmienił (np. przykład do wycofanych cukierków), i tak musisz uruchomić nowe polecenie INSERT.
Uruchomiłem przypadek testowy dla ON UPDATE CASCADE i ON UPDATE DELETE w sqlite3 i wydaje się, że nie ma to żadnego efektu. Mogą nie działać z domyślnym silnikiem DB dla sqlite3, ale funkcjonalność IS jest wymieniona na oficjalnej stronie SQLite:

bardzo opisowy, łatwy do naśladowania przykład UPDATE CASCADE autorstwa sqlite.org
http://www.sqlite.org/foreignk ... ns... Czytaj dalej i zobacz, co myślisz.
Oto obwód, którego użyłem w moim przypadku testowym:
BEGIN TRANSACTION;
CREATE TABLE candy(id integer primary key not null, name text, description text);
INSERT INTO candy VALUES(1,'Laffy Taffy', 'Delicious, soft candy.');
INSERT INTO candy VALUES(2,'Pop Rocks', 'A candy that explodes in your mouth.');
COMMIT;BEGIN TRANSACTION;
CREATE TABLE hard_candy(id integer primary key not null, name text, description text, foreign key(id,name,description) references hard_candy ON DELETE CASCADE ON UPDATE CASCADE);
INSERT INTO hard_candy VALUES(2,'Pop Rocks', 'A candy that explodes in your mouth.');
COMMIT;

Wprowadzono różne aktualizacje w polu opisu id-2 dowolnej tabeli.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Składnia tego jest następująca ...
CREATE TABLE (MySecondTable) Foo INT FOREIGN KEY(Foo) REFERENCES MyFirstTable(PrimaryKeyField) ON DELETE CASCASDE ON UPDATE CASCASDE

działa tylko w wersji 3.6.1 +
Oto dokumenty

http://sqlite.org/foreignkeys.html
http://sqlite.org/foreignkeys.html

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się