世博sqlite外键

Posted

技术标签:

【中文标题】世博sqlite外键【英文标题】:Expo sqlite foreign key 【发布时间】:2019-08-09 15:28:39 【问题描述】:

是否有人使用外键约束对原生 expo 的 sqlite 数据库进行反应?可以使用类似sql的结构吗?

我正在尝试构建具有外键条件的多个表。

示例:如果我们有 2 个表 Persons 和 Orders,其中 personID 在 orders 表中被称为外键。使用 sqlite 是如何完成的?

【问题讨论】:

【参考方案1】:

你会有两个表,可能有一个列作为 rowid 列的别名,这个

例如

CREATE TABLE persons (
    personid INTEGER PRIMARY KEY, 
    personname TEXT
);

CREATE TABLE orders (
    orderid INTEGER PRIMARY KEY, 
    ordername TEXT, 
    person_reference INTEGER REFERENCES persons(personid)
);
注意,您必须打开外键处理,例如通过执行PRAGMA foreign_keys = ON;(或true)。见PRAGMA foreign_keys 在 SQLite 编码中 column_name INTEGER PRIMARY KEY 将该列定义为 rowid column 的别名,如果在插入时未为该列提供值,则将分配一个整数值。第一行的初始值为 1,随后的值通常比最高的 rowid 值大 1(阅读上面的链接,了解为什么该词通常是使用)。

如果您随后尝试为不存在的 personid 插入订单,则会出现外键冲突。

列级定义的替代方法是在表级定义外键,例如

CREATE TABLE orders (
    orderid INTEGER PRIMARY KEY, 
    ordername TEXT, 
    person_reference INTEGER, 
    FOREIGN KEY (person_reference) REFERENCES persons(personid)
);

例如,考虑以下内容:-

INSERT INTO persons (personname) VALUES 
    ('Fred'),
    ('Mary'),
    ('Sue'),
    ('Tom')
;
INSERT INTO orders (ordername, person_reference) VALUES
    ('Order 1 for Fred',1),
    ('Order 2 for Sue',3),
    ('Order 3 for Fred',1),
    ('Order 4 for Mary',2)
;   
INSERT into orders (ordername, person_reference) VALUES
    ('Order 5 for nobody',100);

结果是:-

INSERT INTO persons (personname) VALUES ('Fred'),('Mary'),('Sue'),('Tom')
> Affected rows: 4
> Time: 0.453s


INSERT INTO orders (ordername, person_reference) VALUES
  ('Order 1 for Fred',1),('Order 2 for Sue',3),('Order 3 for Fred',1),('Order 4 for Mary',2)
> Affected rows: 4
> Time: 0.084s


INSERT into orders (ordername, person_reference) VALUES
  ('Order 5 for nobody',100)
> FOREIGN KEY constraint failed
> Time: 0s

即最后一个,因为在 personid 表中没有 personid 为 100 的行,那么最后一个插入(在它自己的 doe 演示中)失败。

您不妨参考SQLite Foreign Key Support

【讨论】:

以上是关于世博sqlite外键的主要内容,如果未能解决你的问题,请参考以下文章

SQLite外键

SQLITE 和外键支持

SQLite3“忘记”使用外键

SQLite 外键

在没有命令的情况下启用 SQLite 外键

播放框架 - SQLite:启用外键