web-dev-qa-db-ja.com

SQLite外部キーの例

私はsql/sqliteの専門家ではありません。2つのテーブルがあるとします。

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

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

どのように挿入しますか? createTable操作は正しいですか?私がしたい:子供は複数の犬を持つことができます犬はより多くの子供を持つことができます

編集

すべての子供が必要で、各子供にその子供に関連付けられている犬のリストが必要な場合はどうなりますか?

16
Safari

多対多

0個以上の犬を持つ子と0個以上の子に属する犬をサポートするには、データベーステーブル構造がMany-To-Many関係をサポートする必要があります。これには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)
};

挿入する方法

3つの各テーブルへの挿入は個別のSQLステートメントでなければなりませんが、同じトランザクションのコンテキストで実行できます。 child_dogテーブルへの挿入(mapping tableとして知られています)は、childテーブルとdogテーブルへの挿入後に発生する必要があります。これには、2つの関連する理由があります。

  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でこれを行う方法を知りたいと思います。pythonは、 '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()
53
ken.ganong

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

Child
- ChildID (PK)
- Name

Dog
- DogID   (PK)
- DogName

Child_Dog
- ChildID (FK)   
- DogID   (FK)
0
John Woo