代码之家  ›  专栏  ›  技术社区  ›  relatively_random

确保两个表之间一致的共同参考

  •  0
  • relatively_random  · 技术社区  · 6 月前

    这是一个简单的SQLite模式:

    CREATE TABLE Lots (
        Id INTEGER PRIMARY KEY
    );
    
    CREATE TABLE Parts (
        Id INTEGER PRIMARY KEY,
        LotId INTEGER NOT NULL REFERENCES Lots
    );
    
    CREATE TABLE Inspections (
        Id INTEGER PRIMARY KEY,
        LotId INTEGER NOT NULL REFERENCES Lots,
        PartId INTEGER NULL REFERENCES Parts
    );
    

    每个批次都有相关的零件和检查,但有些检查也与特定的零件相关联。问题是,没有什么能确保检验及其引用的零件都引用同一批次。

    我在我的应用程序中使用这样的东西作为本地数据存储,所以我不担心这些理论上的不一致,但我 有兴趣学习如何正确处理这个问题。

    1 回复  |  直到 6 月前
        1
  •  1
  •   Damien_The_Unbeliever    6 月前

    您可以在包含LotId列的零件表中添加额外的UNIQUE索引:

    CREATE UNIQUE INDEX i1 ON Parts(Id, LotId)
    

    然后,您可以在外键约束中引用这个新的“超级键”:

    CREATE TABLE Inspections (
        Id INTEGER PRIMARY KEY,
        LotId INTEGER NOT NULL REFERENCES Lots,
        PartId INTEGER NULL REFERENCES Parts,
        FOREIGN KEY (PartId, LotId) REFERENCES Parts (Id, LotId)
    );
    

    那么,您是否选择不将简单的FK包含在只是 PartId 随你。