sql - 更新 SQL 'relationship' 表的有效方法

标签 sql mysql web-applications normalization

假设我有三个正确规范化的表。一种人,一种资格,一种将人映射到资格:

人:

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 建议在表单中添加一些代码来存储字段的原始值,该值可以与提交时的新值进行比较。

最佳答案

从逻辑上讲,UPDATEDELETE 后跟 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/

相关文章:

sql - MS Access中查询表达式中的语法错误(缺少运算符)

php - 在 PHP 中打印出以逗号分隔的关联数组列的最简单方法(来自 MYSQL)

PHP MySQL 将一张表与另一张表连接两次

azure - Azure Web Apps 架构是什么样的?

mysql - 子查询的解决方法返回超过 1 个错误

用于搜索小写字符串的 SQL 查询

php - 今天的 SQL 查询

mysql - 数据库中的帖子类型 - INT 或 VARCHAR

php - 实现自动注销

javascript - ASP.Net 导航选项卡,如 Windows 选项卡控件