2012-12-18 8 views
14

io non sono un esperto in SQL/SQLite .. supponiamo di avere due tabelle:SQLite esempi chiave stranieri

CREATE TABLE child (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    name TEXT, 
); 


CREATE TABLE MyTableB(
    dog TEXT, 
    FOREIGN KEY(dogList) REFERENCES child(id) 
); 

come sarà l'INSERT? è corretta la mia operazioni createTable? Vorrei avere: un bambino può avere più di un cane un cane può avere più figli

* EDIT * * E se io volessi tutti i bambini e per ogni bambino un elenco di cani associati a quel bambino? *

risposta

45

molti-a-molti

Al fine di sostenere un bambino avere zero o più cani e un cane appartenente a zero o più figli, la vostra struttura della tabella del database ha la necessità di sostenere un molti-a- Molti rapporti. Ciò richiede tre tabelle:

CREATE TABLE child (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    name TEXT 
); 


CREATE TABLE dog (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    dog TEXT 
); 

CREATE TABLE child_dog { 
    child_id INTEGER, 
    dog_id INTEGER, 
    FOREIGN KEY(child_id) REFERENCES child(id), 
    FOREIGN KEY(dog_id) REFERENCES dog(id) 
}; 

Come inserire

Un inserto in ciascuno dei tre tavoli devono essere istruzioni SQL separate, ma può avvenire nel contesto della stessa transazione. Gli inserimenti nella tabella child_dog (nota come tabella di mappatura ) devono essere eseguiti dopo l'inserimento nelle tabelle figlio e cane. Questo per due motivi correlati:

  1. È necessario conoscere gli identificatori sia del bambino e il cane al fine di da inserire in questa tabella.
  2. A causa del vincolo di chiave esterna, un inserimento nella tabella child_dog non riuscirebbe se il figlio e/o il cane referenziati non esistessero nel database o nella transazione.

Ecco alcune istruzioni SQL per esempio inserto:

INSERT INTO child VALUES(NULL, 'bobby'); 
SELECT last_insert_rowid(); -- gives the id of bobby, assume 2 for this example 
INSERT INTO dog VALUES(NULL, 'spot'); 
SELECT last_insert_rowid(); -- gives the id of spot, assume 4 for this example 
INSERT INTO child_dog VALUES(2, 4); 

Inserimento In Python

Anche se la tua domanda non ha menzionato pitone, c'è un tag pitone su questa questione così darò per scontato vuoi sapere come farlo in Python. Il modulo sqlite3 in python fornisce una piccola scorciatoia che ti evita di dover eseguire esplicitamente la funzione 'last_insert_rowid()'.

# Import the sqlite3 module 
import sqlite3 
# Create a connection and cursor to your database 
conn = sqlite3.connect('example.db') 
c = conn.cursor() 
# Insert bobby 
c.execute("""INSERT INTO child VALUES(NULL, 'bobby')""") 
# The python module puts the last row id inserted into a variable on the cursor 
bobby_id = c.lastrowid 
# Insert spot 
c.execute("""INSERT INTO dog VALUES(NULL, 'spot')""") 
spot_id = c.lastrowid 
# Insert the mapping 
c.execute("""INSERT INTO child_dog VALUES(?, ?)""", (bobby_id, spot_id)); 
# Commit 
conn.commit() 
conn.close() 
+0

scusa, e se voglio fare un SELECT (tutti), uso un join? come sarà la query? – Safari

+2

@GgSalent dipende da ciò che si sta tentando di recuperare con la selezione, ecco alcuni esempi: 'Nome SELECT, cane FROM figlio, cane, figlio_dog WHERE child.id = figlio_dog.child_id E cane.id = child_dog.dog_id' per selezionare tutte le combinazioni e 'SELECT dog FROM child, dog, child_dog WHERE child.id = child_dog.child_id AND dog.id = child_dog.dog_id AND name = 'bobby'' per i cani di proprietà di bobby. Join interni, aggregati con clausole group by e tali sono anche opzioni a seconda di quali informazioni si desidera. –

+0

Risposta molto bella, grazie Ken! – dotancohen

1

è necessario disporre di tre tabelle per questo. Questo è un esempio di relazione Many-to-Many.

Child 
- ChildID (PK) 
- Name 

Dog 
- DogID (PK) 
- DogName 

Child_Dog 
- ChildID (FK) 
- DogID (FK) 
+0

ok, e come sarà l'INSERISCI? – Safari

+1

è necessario inserire prima le tabelle 'child' e' dog'. poiché 'Child_Dog' dipende dai valori delle due tabelle. –

+0

se la tabella cane o figlio PK è di tipo AUTOINCREMENT .. come posso sapere questo valore per inserirlo nella tabella Child_Dog? Un esempio di operazione ISERT è benvenuto. – Safari