多对多
为了支持拥有零个或多个狗的孩子和属于零个或多个孩子的狗,您的数据库表结构需要支持多对多关系。这需要三个表:
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 表之后发生。这有两个相关的原因:
- 您需要知道孩子和狗的标识符才能插入到此表中。
- 由于外键约束,如果引用的子项和/或狗在数据库或事务中不存在,则插入 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 中的 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()