世博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外键的主要内容,如果未能解决你的问题,请参考以下文章