世博会sqlite外键

时间:2019-03-19 07:05:07

标签: sqlite react-native expo

有人在外键约束下对本地EXPO的sqlite数据库做出反应吗?我们可以使用类似于sql的结构吗?

我正在尝试使用外键条件构建多个表。

示例:如果我们有2个表Persons和Orders,其中personID在orders表中称为外键。使用sqlite怎么办?

1 个答案:

答案 0 :(得分:0)

您将有两个表,也许有一个列作为 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

即最后一个,因为在人员表中没有任何行,且没有任何一个id为100的人,那么最后一个插入(在其本身的doe演示中)将失败。

您不妨参考SQLite Foreign Key Support