当前位置: 首页 > 面试题库 >

SQLite外键示例

许琛
2023-03-14
问题内容

我不是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表之后进行。这是由于两个相关的原因:

  1. 您需要知道孩子和狗的标识符才能插入此表。
  2. 由于外键约束,如果所引用的子项和/或狗在数据库或事务中不存在,则对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中进行此操作。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()


 类似资料:
  • 我想删除一个用户,所以我尝试了: 但很明显,它根本不起作用,因为它与其他表相连。我不能使用DROP,因为它是SQLite。我上网查了一下,什么也没有... 错误:错误

  • 主要内容:语法,实例SQLite 的 DISTINCT 关键字与 SELECT 语句一起使用,来消除所有重复的记录,并只获取唯一一次记录。 有可能出现一种情况,在一个表中有多个重复的记录。当提取这样的记录时,DISTINCT 关键字就显得特别有意义,它只获取唯一一次记录,而不是获取重复记录。 语法 用于消除重复记录的 DISTINCT 关键字的基本语法如下: 实例 假设 COMPANY 表有以下记录: 首先,让我们来

  • 问题内容: 我在Android中使用SQLite。我有查询,执行查询以及如何从游标打印计数。 我的桌子上没有记录。 问题答案: 可以通过getInt(index)作为 游标还具有内置函数getCount()来返回行号,因此也可以这样: 有关更多信息,请参见android devloper的Cursor文档 。

  • 主要内容:示例,删除外键,主键 VS 外键SQL 外键(Foreign Key)用于将两个表连接在一起,让两个表的数据保持同步。 外键由表中的一个字段或者多个字段构成,一个表的外键用来指向另一个表的主键(Primary Key)。包含外键的表称为从表,被指向的表称为主表。从表的数据受到主表的约束,向从表中插入或者更新数据时,外键的值必须存在于主表的主键中。 下面的例子能够很好地说明什么是外键。现在有两个表,分别是 user 和 order

  • 主要内容:Oracle外键约束简介在本教程中,您将学习如何使用Oracle外键来建立表与表之间的关系。 Oracle外键约束简介 外键就是表与表的关系,比如:一个表的一例引用另外一个表的一列。 我们从一个简单例子开始,清楚地理解它的概念。 假设,有两个表:和 分别用来存储供应商分组和供应商信息,如下创建语句: 表存储供应商组,例如一次性供应商,第三方供应商和跨公司供应商。 每个供应商组可能有零个,一个或多个供应商。 表存储供应商信

  • 问题内容: 我在SQLite中有一些表,我试图弄清楚如何重设自动递增的数据库字段。 我读到DELETE FROM tablename应该删除所有内容,并将auto-incrementment字段重置为0,但是这样做时,它只会删除数据。插入新记录后,自动增量将从删除前的中断处开始提取。 我的ident字段属性如下: 栏位类型:integer 字段标志:PRIMARY KEY,AUTOINCREMEN