【问题标题】:How to design these sqlite tables with delete and update cascade如何使用删除和更新级联设计这些 sqlite 表
【发布时间】:2012-08-06 20:01:24
【问题描述】:

我尝试过这样做:

Recipe 带有 RecipeID(主键和外键)和 RecipeName(唯一)的表。
Ingredient 带有成分 ID(主键和外键)和成分名称(唯一)的表。 RecipeDetail 表,包含 RecipeID、成分 ID 和成分名称。

  • 如果用户从成分表中删除成分,则必须删除 RecipeDetail 中具有此成分 ID 的所有记录。
  • 如果用户从Recipe Table 中删除Recipe,RecipeDetail 中具有此RecipeId 的所有记录都必须删除。

有什么线索吗?谢谢

【问题讨论】:

  • 你必须标记你正在实施你的程序的平台。是安卓还是JAVA???
  • @NilayOnAndroid:平台应该与这个问题无关,这可以使用约束来解决。
  • @PeterLang:取决于目标 Android 版本。在 Android 2.2 之前的任何事情中,外键都必须使用触发器或代码来实现。

标签: sqlite


【解决方案1】:

Documentation 解释了如何在表之间创建约束。要强制删除孤立记录,请使用ON DELETE CASCADE

还要确保外键支持is enabled.


您的创建脚本可能如下所示

CREATE TABLE RecipeDetail(
  RecipeID      INTEGER REFERENCES Recipe(RecipeID) ON DELETE CASCADE,
  IngredientID  INTEGER REFERENCES Ingredient(IngredientID) ON DELETE CASCADE,
  PRIMARY KEY (RecipeID, IngredientID)
);

主键确保没有将任何成分分配给配方两次。 IngredientName不应该存储在交集表中,这会导致数据冗余。

【讨论】:

  • 我想我试过这个,如果我从配方表中删除RecipeID,是的,与RecipeID 相关的RecipeDetail 行将被删除。但是如果我从成分表中删除了成分 ID,则只会删除 RecipeDetail 表中具有 IngridientID 的行,而不是整个行。
  • 条件应该是如果成分表中的IngridientID或配方表中的RecipeID被删除,RecipeDetails表中与成分ID和RecipeId相关的所有行都必须删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多