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

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

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

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

【问题讨论】:

    标签: sqlite react-native expo


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-15
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      • 2019-11-11
      • 2019-03-25
      相关资源
      最近更新 更多