如何在联结表中执行编辑

时间:2011-04-13 13:36:42

标签: mysql sql database sql-server-2008 database-design

在联结表中进行编辑的最佳做法是什么?

Items{ItemId, Name, Price...}
Shops{ShopId, Name, Address...}
ItemsInShops{ItemId, ShopId, DeliveryDate...}

现在我在一家商店有30件商品。我想编辑该列表,我取消选中10项并检查50个新项目。

我通过以下方式执行此操作:从'ItemId'中删除'ItemsInShops'中的所有行并添加新值。我认为这不是一个好的解决方案。有没有更好的方法来进行这种更新?

也许我没有用好的例子表达问题。看看这个:

User{UserId, Username, Password...}
Roles{RoleId, Name, Description} // Admin, Member, Superuser, Junior etc
UsersInRoles{UserId,RoleId}

用户可以拥有任意数量的角色。

John > Admin, Member, Superuser

这是联结表'UserInRoles'中的三行。 如果我想更新此用户以具有以下角色:

John > Member, Junior

现在我按以下方式对数据库进行此更新: 我从'UserInRoles'表中删除所有John角色并添加新数据。我不知道有没有更好的方法来做这个更新,除了删除所有并插入新的?如果由于某种原因(例如丢失了互联网连接)更新失败怎么办?

4 个答案:

答案 0 :(得分:2)

根据评论,添加/删除数据库数据没有比添加/删除数据库数据更好的方法。

或者,您可以在数据库中包含状态信息的列,例如“付费”“已售出”“已发送日期”“已取消”等。然后,您将更新状态,而不是删除记录。这样可以更轻松地检查过去的交易并保持记录正确(例如“unancel”)。

答案 1 :(得分:1)

您可以通过MERGE关键字查看BOOKS Online。

答案 2 :(得分:1)

您更新的问题很有趣。

效率方面,删除然后添加数据可以使用MERGE完成。

关于连续运行的两个查询,当它们真正形成一个进程时,您需要事务。它们是“全有或全无”设置,以便一组查询全部成功或全部失败(全部“回滚”)。交易非常有用,例如“用户付费+产品已交付”或“过去的数据已存档+已删除”,许多教科书和网站都会对其进行详细讨论。

答案 3 :(得分:1)

  

我不知道有没有更好的方法   执行此更新,而不是删除   所有并插入新的?

您不必删除所有要开始的行。

您只能删除不再适用的行,并仅插入新行。或者,您可以使用适用的值更新不再适用的值。

所以要从中获取

Name    Role
--
John    Admin
John    Member
John    Superuser

到这个

Name    Role
--
John    Member
John    Junior

您可以删除不再适用的内容。 。

delete from userinroles
where Name = 'John' 
  and (Role = 'Admin' or Role = 'Superuser');

并插入适用的内容。

insert into userinroles (Name, Role)
values ('John', 'Junior');

或者您可以使用新值更新值。

delete from userinroles
where Name = 'John' 
  and Role = 'Admin';

其次是

update userinroles
set Role = 'Junior'
where 'Name' = 'John' and Role = 'Superuser';

你说

  

如果因某种原因导致更新失败怎么办?   (失去了互联网连接   例子)?

这就是交易的目的。单个SQL事务中的多个语句全部或全部 - 要么都成功,要么不进行任何更改。