在联结表中进行编辑的最佳做法是什么?
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角色并添加新数据。我不知道有没有更好的方法来做这个更新,除了删除所有并插入新的?如果由于某种原因(例如丢失了互联网连接)更新失败怎么办?
答案 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事务中的多个语句全部或全部 - 要么都成功,要么不进行任何更改。