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

更新SQL“relationship”表的有效方法

  •  3
  • AmbroseChapel  · 技术社区  · 14 年前

    假设我有三张标准化的桌子。一个人,一个资历,一个将人映射到资历:

    人:

    id | Name
    ----------
    1  | Alice
    2  | Bob
    

    度:

    id | Name
    ---------
    1  | PhD
    2  | MA
    

    达到学位的人:

    person_id | degree_id
    ---------------------
    1         | 2         # Alice has an MA
    2         | 1         # Bob has a PhD
    

    所以我必须通过我的Web界面更新这个映射。(我犯了一个错误。鲍勃有学士学位,而不是博士学位,爱丽丝刚拿到学士学位。)

    一对多关系映射有四种可能的状态:

    • 以前是真的,现在应该是假的
    • 以前是假的,现在应该是真的了
    • 以前是真的,应该是真的
    • 以前是假的,应该是假的

    我不想做的是从四个复选框中读取值,然后点击数据库四次,说“Bob以前有过BA吗?”“他现在有了。”“鲍勃以前有博士学位吗?”因为他已经不在了”等等。

    其他人如何解决这个问题?

    我很好奇是否有人能用我同样的方法来解决问题。

    更新1 :有一天,当我遇到同样的情况时——只需删除所有旧条目,不管正确与否,然后插入新条目。

    更新2 :potatpeelings建议在表单中添加一些代码,存储字段的原始值,可以与提交时的新值进行比较。

    2 回复  |  直到 14 年前
        1
  •  2
  •   onedaywhen    14 年前

    逻辑上,一个 UPDATE 是一个 DELETE 其次是 INSERT (考虑SQL Server触发器可以访问名为 inserted deleted 但是没有 updated 表)。因此,您应该只能够访问数据库两次,即第一次 删除 Bob的所有行(正确或其他),第二行 插入 Bob的所有正确行。

    如果只想访问数据库一次,请考虑使用标准的SQL MERGE ,假设您的DBMS支持它(SQL Server在2008年推出)。

        2
  •  0
  •   potatopeelings    14 年前

    假设用户界面是复选框网格(1)。在Ismail评论中)

               MA      PhD    
    Alice      x 
    Bob                 x
    

    其中x表示复选框。我将使用前端脚本只发送 变化 回到服务器。然后在一个事务或合并(如ismail的链接中所指出的)下对人员进行插入和删除,直到达到一定程度。

    BEGIN TRAN
    INSERT query
    DELETE query
    COMMIT
    

    您将通过插入(和删除)查询人员ID、学位ID对的列表。对于您的示例,插入查询将是单对(2,2),对于删除查询则是单对(2,1)。