2012-12-18 90 views
14

我不是在SQL/SQLite的專家.. 假設我們有兩個表:SQLite的外鍵例子

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


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

會有怎樣的INSERT?我的createTable操作是否正確? 我想有: 孩子能有一個以上的狗 狗可以有更多的孩子

*編輯* * 如果我想所有的孩子,每個孩子什麼與那個孩子有關的狗的名單? *

回答

45

許多一對多

爲了支持具有零個或更多的狗和屬於零個或更多的孩子一個狗的孩子,你的數據庫表結構需要支持很多,到 - 很多的關係。這需要三個表:

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表(稱爲映射表)必須在插入子表和狗表後插入。這有兩個方面的原因:

  1. 你需要知道孩子和狗兩者的標識符,以 插入到這個表。
  2. 由於外鍵約束,如果引用的子和/或狗不存在於數據庫或事務中,則插入到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() 
+0

對不起,如果我想做一個SELECT(全部),我使用一個連接?查詢將如何? – Safari

+2

@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子句聚合等也是選項,取決於您想要的信息。 –

+0

非常好的答案,謝謝你肯! – dotancohen

1

您需要爲此設置三個表格。這是Many-to-Many關係的一個例子。

Child 
- ChildID (PK) 
- Name 

Dog 
- DogID (PK) 
- DogName 

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

好的,怎麼會INSERT? – Safari

+1

您需要先在「小孩」和「狗」表中插入。因爲'Child_Dog'依賴於這兩個表的值。 –

+0

如果狗或兒童表PK是AUTOINCREMENT類型..我可以知道這個值插入到Child_Dog表嗎? ISERT操作的一個例子是歡迎.. – Safari