2012-12-18 19 views
14

は... は、我々は2つのテーブルを持っていると仮定しますか?私のcreateTable操作が正しいですか? 私が持っているしたいと思います: 子が複数の犬 に犬を持つことができるより多くの子供SQLiteの外部キーとして

* EDIT * * 私が望んでいた場合は、すべての子どもたちとそれぞれの子のためを持つことができますその子供に関連する犬のリスト? *

答えて

45

多対多

ゼロ以上の犬と0個以上の子どもたちに属している犬を持つ子供をサポートするために、データベースのテーブル構造は、多対をサポートする必要があります多くはの関係です。これは、3つのテーブルが必要です。別のSQL文でなければならない3つのテーブルのそれぞれに

のインサートを挿入するには、同じトランザクションのコンテキスト内で場所を取ることができますどのように

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) 
}; 

。 child_dogテーブル(マッピングテーブル)への挿入は、子テーブルと犬テーブルに挿入した後に行う必要があります。

  1. あなたは、このテーブルに挿入する するために、子供と犬の両方の識別子を知っておく必要があります。これは、二つの関連の理由からです。
  2. 参照された子および/または犬がデータベースまたはトランザクションに存在しない場合、外部キー制約のためにchild_dogテーブルへの挿入が失敗します。ここで

挿入のためのいくつかの例のSQL文は、次のとおりです。

私は仮定しますので、あなたの質問はこの質問にPythonのタグがあり、パイソンは言及しなかったが、Pythonの

で挿入

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の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'と、child.id = child_dog.child_idとdog.id = child_dog.dog_idとAND name = 'bobby''の両方を選択するために使用されます。内部結合、グループ句による集計などは、必要な情報に応じてオプションになります。 –

+0

とても素敵な答えです、ありがとうKen! – dotancohen

1

これには3つのテーブルが必要です。これは、Many-to-Manyの関係の例です。

Child 
- ChildID (PK) 
- Name 

Dog 
- DogID (PK) 
- DogName 

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

ok、どのようにINSERTを行いますか? – Safari

+1

'child'と' dog'テーブルに最初に挿入する必要があります。 'Child_Dog'は2つのテーブルの値に依存するからです。 –

+0

犬または子テーブルPKがAUTOINCREMENTタイプの場合..この値をChild_Dogテーブルに挿入する方法はわかりますか? ISERT操作の例は歓迎です。 – Safari