SQL删除与更新

时间:2015-09-16 18:40:39

标签: sql-server tsql

我已经看过很多次这样的问题但在这种配置中并不完全。我有一张有一对多关系的表。

假设我有一张电脑桌和零件表。用户在计算机表中输入通用信息,然后选择存储在部件表中的部件,这些部件与computerId的计算机表有关系。所以原始的写入是一个简单的插入。现在让我们说用户再次选择计算机并更改电脑上的部件,添加一些新的,删除一些,并更新一些。然后用户点击保存以保存更改。我在计算机表上运行了一个简单的更新,但现在是零件表的问题。

最好从零件表中删除计算机ID的所有记录,然后对所选的所有零件进行干净的插入。 或者运行一些方法来查看表中的现有部件以及部件已更新的位置更新记录,其中部件不再存在执行删除,然后插入其余部分?

3 个答案:

答案 0 :(得分:1)

显然,简单的解决方案是删除所有然后插入全部。
此SQL流量,锁定和表碎片的缺点 如果它是小表,只有少数并发用户那么好。

在高容量环境中,我执行以下操作 没有更新 - 这只是一个忽略 - 删除已删除的项目
- 忽略任何未更改的项目
- 插入新物品
你可以用一两个/三个语句来做到这一点 或者您可以定义存储过程 在插入之前执行删除以首先清除空间。

你可以获得真正的幻想并使用删除/插入更新,但这比我认为的更复杂。如果项目计数不同,您仍会有插入或删除。

delete comp_part 
 where compID = @compID and partID not in (....);

插入有点棘手:
您可以使用一系列插件进行操作,如果您有PK,则只需插入插件即可 另一种方法是创建一个@table并将其用于删除和插入

如果你有一个非常忙碌的桌子,这只是值得的麻烦。

答案 1 :(得分:0)

这一切都取决于商业模式,如果你想跟踪交易而不是删除它的好方法。如果您与客户进行的所有旧交易都比对跟踪目的有利。您的CustomerID将是主键,您可以使用另一个唯一键作为PartOrderID,它将是每个插入的唯一值。

希望这有帮助

答案 2 :(得分:0)

你真的应该有三张桌子。产品,零件和产品部分; ProductPart表将存储"该产品具有这些部分"的关联。就更新而言,最简单的方法是删除给定产品的所有ProductPart并重新插入所需的记录。