更新表但保留一个现有数据

时间:2012-03-23 02:54:16

标签: mysql

我正在研究这些表:

staff(staffID, staffName, branchID, address, phone, lastUpdatedDate)
branchRef(branchID, branchName)

生成按分支

分类的员工详细信息报告
SELECT staffID, staffName, staff.branchID, address, phone, lastUpdateDate, branchName
FROM staff, branchRef
WHERE staff.branchID=branchRef.branchIC

例如,如果,John在2011年的Branch01和Branch03 2012中,那么。更新到(Branch02,2012)时如何保留(Branch01,2011)。我已经读过使用触发器来完成这项工作,触发器涉及几乎所有的字段,但我只希望保留旧的branchID的记录。这个问题有什么建议吗?谢谢!

2 个答案:

答案 0 :(得分:0)

听起来您需要更新数据模型。

没有考虑到工作人员可能会切换branches.c

触发器无法帮助您解决此问题。

你可以:

  • 制作一个新表staff_member_works_in_branch,其中包含start_dateend_datestaffIdbranchId等字段,以表示新的m:n关系。您的报告可能需要更新。 (推荐的解决方案,如果您经常这样做)
  • 将移动的员工数据记录保存在数据库之外
  • 使用“假”员工行(不推荐)实施kludge

答案 1 :(得分:0)

目前,您有一对多关系:一名员工有一个分支,但一个分支有很多员工。

如果一名工作人员现在能够成为多个分支机构的一部分(即使是历史记录,正如您在评论中所说的那样),那么这种关系将成为多对多关系。除此之外我想想你想让其他分支机构按顺序排列,所以你可以做的是:

保持现有表格不变,但从员工处删除branchId:

staff(staffID, staffName, address, phone, lastUpdatedDate)
branchRef(branchID, branchName)

创建一个新表staff_branches,用于保存它们之间的关系:

staff_branches(staffID, branchID)

表的主键是两个字段。现在您应该实现这些表的顺序。如果您只关心订单,只需添加一个包含该订单的整数字段(1,2等)。如果您想获得其他信息(例如工作人员在该分支机构中开始的日期),只需使用orderField的日期:

staff_branches(staffID, branchID, orderField)

完成后,您可以通过在该表中搜索具有该staffId的max(orderField)的分支来查询员工的当前分支。