許多一對多
爲了支持具有零個或更多的狗和屬於零個或更多的孩子一個狗的孩子,你的數據庫表結構需要支持很多,到 - 很多的關係。這需要三個表:
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)
};
如何插入
的插入到每個三個表必須是單獨的SQL語句,但可以發生在同一個事務的上下文。插入child_dog表(稱爲映射表)必須在插入子表和狗表後插入。這有兩個方面的原因:
- 你需要知道孩子和狗兩者的標識符,以 插入到這個表。
- 由於外鍵約束,如果引用的子和/或狗不存在於數據庫或事務中,則插入到child_dog表中將失敗。
下面是插入一些例如SQL語句:
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);
插入在Python
雖然你的問題沒有提到蟒蛇,對這個問題的一個Python代碼,所以我會承擔你想知道如何在Python中做到這一點。 python中的sqlite3模塊提供了一個很好的小捷徑,可以讓你不必顯式運行'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()
對不起,如果我想做一個SELECT(全部),我使用一個連接?查詢將如何? – Safari
@GgSalent取決於你試圖用你的選擇檢索什麼,這裏有一些例子:'SELECT name,dog FROM child,dog,child_dog WHERE child.id = child_dog.child_id AND dog。id = child_dog.dog_id',用於選擇所有組合,並且''''''爲bobby擁有的狗選擇狗FROM child,dog,child_dog WHERE child.id = child_dog.child_id AND dog.id = child_dog.dog_id AND name ='bobby''。內部連接,與group by子句聚合等也是選項,取決於您想要的信息。 –
非常好的答案,謝謝你肯! – dotancohen