SQLite外键示例

Saf*_*ari 15 python sql sqlite foreign-keys insert

我不是sql/sqlite的专家..假设我们有两个表:

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

CREATE TABLE MyTableB(
  dog TEXT, 
  FOREIGN KEY(dogList) REFERENCES child(id)
);
Run Code Online (Sandbox Code Playgroud)

INSERT怎么样?我的createTable操作是否正确?我想:一个孩子可以有一只以上的狗,一只狗可以有更多的孩子

编辑

如果我希望所有孩子和每个孩子都有与该孩子相关的狗列表怎么办?

ken*_*ong 53

许多一对多

为了支持拥有零个或多个狗的孩子以及属于零个或多个孩子的狗,您的数据库表结构需要支持多对多关系.这需要三个表:

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)
};
Run Code Online (Sandbox Code Playgroud)

如何插入

三个表中每个表的插入必须是单独的SQL语句,但可以在同一事务的上下文中进行.插入child_dog表(称为映射表)必须在插入child和dog表后插入.这有两个相关的原因:

  1. 你需要知道孩子和狗的标识符才能插入到这个表中.
  2. 由于外键约束,如果引用的子和/或狗在数据库或事务中不存在,则插入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);
Run Code Online (Sandbox Code Playgroud)

在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()
Run Code Online (Sandbox Code Playgroud)

  • @GgSalent取决于您尝试使用select检索的内容,以下是一些示例:`SELECT name,dog FROM child,dog,child_dog WHERE child.id = child_dog.child_id AND dog.id = child_dog.dog_id`用于选择所有组合和`SELECT dog FROM child,dog,child_dog WHERE child.id = child_dog.child_id AND dog.id = child_dog.dog_id AND name ='bobby'` for bobby拥有的狗.内部联接,具有group by子句的聚合等也是选项,具体取决于您想要的信息. (3认同)
  • 我可能会建议从你的答案中删除AUTOINCREMENT,因为它不是必需的,并且不是sqlite推荐的,只是为了避免任何混淆.请参阅https://www.sqlite.org/autoinc.html(1.1). (2认同)