假设我有三个正确规范化的表。一种人,一种资格,一种将人映射到资格:
人:
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
然后我必须通过我的网络界面更新这个映射。 (我犯了一个错误。Bob 拥有学士学位,而不是博士学位,而 Alice 刚刚获得了工程学学士学位。)
这些一对多关系映射有四种可能的状态:
- 以前是真的,现在应该是假的
- 之前是假的,现在应该是真的
- 以前为真,应该保持为真
- 之前是假的,应该保持假
我不想做的是读取四个复选框的值,然后四次访问数据库说“Bob 以前有文学学士学位吗?他现在有了。” “鲍勃以前有博士学位吗?因为他没有了”等等。
其他人如何解决这个问题?
我很好奇是否有人得出了与我相同的解决方案。
更新 1:onedaywhen 提示我发生过同样的事情——只需删除所有旧条目,无论是否正确,然后插入新条目。
更新 2:patotopeelings 建议在表单中添加一些代码来存储字段的原始值,该值可以与提交时的新值进行比较。
最佳答案
从逻辑上讲,UPDATE
是 DELETE
后跟 INSERT
(考虑到 SQL Server 触发器可以访问名为 inserted 的逻辑表
和 deleted
但没有 updated
表)。因此,您应该只能访问数据库两次,即第一次 DELETE
Bob 的所有行(正确或不正确),第二次 INSERT
Bob 的所有正确行。
如果您只想访问数据库一次,请考虑使用标准 SQL 的 MERGE
,前提是您的 DBMS 支持它(SQL Server 在 2008 年引入了它)。
关于sql - 更新 SQL 'relationship' 表的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3042644/