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:
- È necessario conoscere gli identificatori sia del bambino e il cane al fine di da inserire in questa tabella.
- 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()
fonte
2012-12-18 16:02:08
scusa, e se voglio fare un SELECT (tutti), uso un join? come sarà la query? – Safari
@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. –
Risposta molto bella, grazie Ken! – dotancohen