2011-09-24 20 views
5

Come creare uno a molti in SQLITE3? Ho 2 tabelle:Come creare uno a molti in SQLITE3?

Mans: 
_id name 
1 antony 
2 fred 

e

point 
_id date point 
1  23  77 
     24  99 

2  25  78 
     5  0 

non so sintassi SQL, aiutami, per favore.

+0

Dubito che la seconda tabella sia così: queste tabelle SQL o i dati che si desidera immettere? – Mark

+0

Quello è il secondo tavolo –

risposta

3

La sintassi per questo è il seguente ....

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

funziona solo su v3.6.1 +

Ecco la documentazione http://sqlite.org/foreignkeys.html

+0

il cattivo del gamberetto-skrillin illin: hai controllato la mia risposta? –

11

Andando da ciò iamkrillin lo shrimp- illin cattivo di skrillin:

CREATE TABLE (points) points_id INT 
FOREIGN KEY(man_id) REFERENCES mans(PrimaryKeyField) 
ON DELETE CASCASDE ON UPDATE CASCASDE 

Ecco un esempio del mondo reale. Supponiamo che tu abbia alcune persone che si rivolgono a te: il tuo staff, i tuoi amici, le imprese locali in cui fai pubblicità, ecc. I clienti che entrano sono chiamati business "di riferimento". Ogni persona conta come un solo referente, ma un referente può riferire molti riferimenti (ad esempio, un dipendente può riferire 20 nuovi clienti, il dipendente è il referente e il dipendente ha fatto 20 referenze). Quindi, avete 1 riferimento e 20 referals (uno-a-molti):

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. 

Ora, è possibile che più di una persona si riferisce un referral, ma penso che è prassi aziendale standard solo a compensare un singolo referente. Quindi, non hai mai bisogno di elencare due referenti. Questa sarà sempre una relazione 1-a-1 o 1-a-molti; pertanto, dovresti renderlo una tabella 1-a-molti. Non sono molto abile nel materiale CASCADE, ma cercherò di capire come si adatta.

A prima vista, appare ON UPDATE CASCADE ON DELETE CASCADE non appartiene alla mia risposta perché la rimozione dell'ultimo riferimento non dovrebbe rimuovere il referente.

Guardando 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) 

Se si elimina una caramella dura dal tavolo hard_candy, poi si sono anche eliminando dalla tabella all_candy perché una caramella dura è un tipo di caramelle, e se il tipo di di caramelle è cambiato (ad esempio, per caramelle fuori produzione), quindi un nuovo comando INSERT deve essere eseguito, comunque.

Ho eseguito un test case per ON UPDATE CASCADE e ON UPDATE DELETE in sqlite3 e sembra che non abbia alcun effetto. Forse non funzionano con il motore db predefinito per sqlite3, ma la funzionalità è elencata sul sito web ufficiale di SQLite: a very descriptive, easy-to-follow example of ON UPDATE CASCADE by sqlite.org. Leggi e guarda cosa ne pensi.

Questo è lo schema che ho usato per il mio test case:

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 vari aggiornamenti su id-2 descrizione campo o della tabella.

Problemi correlati