SQLite外键示例

2024-03-28 05:13:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

CREATE TABLE MyTableB(
  dog TEXT, 
  FOREIGN KEY(dogList) REFERENCES child(id)
);

如何插入?是否正确的createTable操作? 我想要: 一个孩子可以养多条狗 狗可以多生孩子

编辑

如果我想让所有的孩子和每个孩子都有一份和那个孩子有关的狗的名单呢?


Tags: keytextnameidchildsqlitesqlcreate
2条回答

多对多

为了支持一个具有零个或多个狗的子级和一个属于零个或多个子级的狗,您的数据库表结构需要支持一个多对多关系。这需要三张桌子:

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语句,但可以在同一事务的上下文中进行插入。插入子狗表(称为映射表)必须在插入子狗表和狗表之后进行。这有两个相关原因:

  1. 你需要知道孩子和狗的身份,以便 插入此表。
  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中实现这一点。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)

相关问题 更多 >