私は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操作は正しいですか?私がしたい:子供は複数の犬を持つことができます犬はより多くの子供を持つことができます
すべての子供が必要で、各子供にその子供に関連付けられている犬のリストが必要な場合はどうなりますか?
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つの関連する理由があります。
以下は、挿入用の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は、 '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()
これには3つのテーブルが必要です。これは、Many-to-Many
関係の例です。
Child
- ChildID (PK)
- Name
Dog
- DogID (PK)
- DogName
Child_Dog
- ChildID (FK)
- DogID (FK)