我不是在SQL / SQLite的专家..假设我们有两个表:
CREATE TABLE child (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
);
CREATE TABLE MyTableB(
dog TEXT,
FOREIGN KEY(dogList) REFERENCES child(id)
);
如何将INSERT? 是纠正我的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()
你需要有这个三个表。 这是一个例子Many-to-Many
的关系。
Child
- ChildID (PK)
- Name
Dog
- DogID (PK)
- DogName
Child_Dog
- ChildID (FK)
- DogID (FK)