如何解决如何在联结表中进行编辑
| 在联结表中进行编辑的最佳实践是什么?Items{ItemId,Name,Price...}
Shops{ShopId,Address...}
ItemsInShops{ItemId,ShopId,DeliveryDate...}
现在我在一间商店里有30件物品。我想编辑该列表,然后取消选中10个项目,然后选中50个新项目。
我通过以下方式执行此操作:通过\'ItemId \'从\'ItemsInShops \'中删除所有行,并添加新值。我认为这不是很好的解决方案。有没有更好的方法来进行这种更新?
也许我没有以很好的例子来表达问题。看看这个:
User{UserId,Username,Password...}
Roles{RoleId,Description} // Admin,Member,Superuser,Junior etc
UsersInRoles{UserId,RoleId}
用户可以具有任意数量的角色。
John > Admin,Superuser
那是联结表\'UserInRoles \'中的三行。
如果我想将此用户更新为具有以下角色:
John > Member,Junior
现在,我通过以下方式对数据库进行此更新:
我从\'UserInRoles \'表中删除了所有John角色,并添加了新数据。我不知道除了删除所有内容并插入新内容外,还有什么更好的方法来进行此更新?如果由于某种原因更新失败(例如,互联网连接丢失)怎么办?
解决方法
我不知道还有什么更好的办法
执行此更新,而不是删除
全部并插入新的?
您不必删除所有开始的行。
您只能删除不再适用的行,而只能插入新的行。或者,您可以使用不再适用的值来更新不再适用的值。
所以要从中得到
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事务中的多个语句全部或全部都不成功-要么全部成功,要么不进行任何更改。
,根据注释,没有比添加/删除数据库数据更好的方法来添加/删除数据库数据。
或者,您可以在数据库中有用于状态信息的列,例如\“已付款\” \“已售出\” \“交货日期” \“已取消\”等。然后,您将更新状态,而不是删除记录。这样可以更轻松地检查过去的交易并保持记录正确(例如\“ uncancel \”)。
,您可能会在MERGE关键字的BOOKS Online中查找。
,您更新的问题很有趣。
为了提高效率,可以使用MERGE删除然后添加数据。
关于连续运行的两个查询,当它们真正形成一个流程时,您需要事务。它们是“全有或全无”设置,因此一组查询要么全部成功,要么全部失败(全部“回滚”)。交易非常有用,例如“用户付费+产品已交付”或“过去数据已存档+删除”,并且在许多教科书和网站中都对它们进行了详细讨论。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。