Python SQLite外键示例

Python SQLite外键示例,python,sql,sqlite,insert,foreign-keys,Python,Sql,Sqlite,Insert,Foreign Keys,我不是sql/sqlite方面的专家。。 假设我们有两张桌子: CREATE TABLE child ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, ); CREATE TABLE MyTableB( dog TEXT, FOREIGN KEY(dogList) REFERENCES child(id) ); 如何插入?我的createTable操作正确吗? 我希望: 一个孩子可以养多条狗 狗可以生更多的孩子 编

我不是sql/sqlite方面的专家。。 假设我们有两张桌子:

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

CREATE TABLE MyTableB(
  dog TEXT, 
  FOREIGN KEY(dogList) REFERENCES child(id)
);
如何插入?我的createTable操作正确吗? 我希望: 一个孩子可以养多条狗 狗可以生更多的孩子

编辑
如果我想要所有的孩子,并且每个孩子都有一个与这个孩子相关的狗的列表,那该怎么办呢?

你需要有三个表格。这是多对多关系的一个例子

Child
- ChildID (PK)
- Name

Dog
- DogID   (PK)
- DogName

Child_Dog
- ChildID (FK)   
- DogID   (FK)
多对多 为了支持一个拥有零只或多只狗的孩子和一只属于零只或多只孩子的狗,您的数据库表结构需要支持多对多关系。这需要三个表格:

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表之后进行。这有两个相关原因:

你需要知道孩子和狗的识别码,以便 插入到该表中。 由于外键约束,如果数据库或事务中不存在引用的子和/或狗,则插入到子狗表中的操作将失败。 以下是一些用于insert的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”函数

导入sqlite3模块 导入sqlite3 创建到数据库的连接和游标 conn=sqlite3.connect'example.db' c=连接光标 插入波比 c、 将executeINSERT插入子值调用“bobby” python模块将最后一行id插入游标上的变量中 bobby_id=c.lastrowid 插入点 c、 将executeINSERT插入到dog Values中,然后单击“spot” spot_id=c.lastrowid 插入映射 c、 将executeINSERT插入到child_dog值?、?、bobby_id、spot_id中; 犯罪 康涅狄格州 康涅狄格州
您需要先在子表和狗表上插入。因为Child_Dog依赖于两个表的值。如果Dog或Child表PK是自动递增类型。如何知道该值以将其插入Child_Dog表?iSeries操作的一个例子是welcome.。对不起,如果我想做全选,我就用join?如何进行查询?@GgSalent取决于您试图使用select检索的内容,以下是一些示例:select name、dog FROM child、dog、child\u dog WHERE child.id=child\u dog.child\u id和dog.id=child\u dog.dog\u id用于选择所有组合,并从child、dog中选择dog,child\u dog其中child.id=child\u dog.child\u id和dog.id=child\u dog.dog\u id和name='bobby'表示bobby拥有的狗。内部连接、通过group by子句聚合,以及其他一些选项,这取决于您需要的信息。我正在绞尽脑汁地研究如何进行关系插入,这是我遇到的最干净、最容易理解的示例之一。因为我使用的是Python,所以我可能建议从您的答案中删除AUTOINCREMENT,因为它不是必需的,sqlite也不建议这样做,只是为了避免任何混淆。请参阅1.1。如果您使用的是Python,请查看SQLAlchemy。它提供了一个功能强大的对象关系映射器ORM,用于处理多对多关系之类的事情。仅供参考:通常不需要自动增量,这会增加额外的开销。在大多数情况下,对于自动递增的id列,仅整数主键就足够了。