2011-09-24 16 views
5

Jak utworzyć jedno do wielu w SQLite3? Mam 2 tabele:Jak utworzyć jedno do wielu w SQLITE3?

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, pomóż mi, proszę.

+0

Wątpię, czy druga tabela jest taka - czy te tabele SQL lub dane, które chcesz wprowadzić? – Mark

+0

To jest druga tabela –

Odpowiedz

3

Składnia ta jest następująca ....

CREATE TABLE (MySecondTable) Foo INT FOREIGN KEY(Foo) REFERENCES MyFirstTable(PrimaryKeyField) ON DELETE CASCASDE ON UPDATE CASCASDE 

działa tylko na v3.6.1 +

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

+0

złego czarnego krewetka-skrillina: czy sprawdziłeś moją odpowiedź? –

11

Przechodzenie przez co iamkrillin na shrimp- Illin skrillin czarny charakter:

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 osoby, które odnoszą się do Ciebie: Twój personel, Twoi znajomi, lokalne firmy, w których reklamujesz itp. Klienci, którzy przychodzą, nazywają się "skierowaniem". Każda osoba liczy się tylko jako jedna skierowana, ale referer może polecać wiele odsyłaczy (na przykład pracownik może polecić 20 nowych klientów, pracownik jest twoim odźwiernym, a pracownik złożył 20 odsyłaczy). Tak, masz 1 Referer i 20 Odsyłające (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. 

Teraz możliwe jest, że więcej niż jedna osoba odnosi się referal, ale myślę, że jest to standardowa praktyka biznesu tylko kompensować jeden referer. Więc nigdy nie musisz wymieniać dwóch stron odsyłających. To zawsze będzie relacja 1 do 1 lub 1 do wielu; dlatego powinieneś zrobić tabelę jeden do wielu. Nie jestem biegły w sprawach CASCADE, ale spróbuję dowiedzieć się, jak to pasuje.

Na pierwszy rzut oka wydaje się, że ON UPDATE CASCADE ON DELETE CASCADE nie należy do mojej odpowiedzi, ponieważ usunięcie ostatniego skierowania nie powinno usunąć referer.

Patrząc na a different example:

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 landrynki z tabeli hard_candy, to jesteś także usunięcie go z tabeli all_candy ponieważ landrynki to rodzaj cukierków, a jeśli typem zmienił się cukierek (na przykład na przerwane cukierki), a następnie konieczne jest wykonanie nowego polecenia INSERT.

Uruchomiłem test case dla ON UPDATE CASCADE i ON UPDATE DELETE w sqlite3 i wygląda na to, że nie działa. Być może nie działają one z domyślnym silnikiem db dla sqlite3, ale funkcjonalność IS jest wymieniona na oficjalnej stronie SQLite: a very descriptive, easy-to-follow example of ON UPDATE CASCADE by sqlite.org. Czytać i zobaczyć, co myślisz.

Jest to schemat Kiedyś na moim przypadku testu:

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; 

Ran różne aktualizacje po obu stołu id-2 Opis dziedzinie.

Powiązane problemy