我不是sql / sqlite的专家。假设我们有两个表:
CREATE TABLE child ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, ); CREATE TABLE MyTableB( dog TEXT, FOREIGN KEY(dogList) REFERENCES child(id) );
如何插入?我的createTable操作正确吗?我希望拥有:一个孩子可以养一只以上的狗狗可以养更多的孩子
如果我想要所有孩子,并为每个孩子列出与该孩子相关的狗的清单,该怎么办?
为了支持一个零个或多个狗的孩子以及一个零个或多个孩子的狗,您的数据库表结构需要支持“ 多对多” 关系。这需要三个表:
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表之后进行。这是由于两个相关的原因:
以下是一些用于插入的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()