如何防止sql存储过程中的重复更新

Posted

技术标签:

【中文标题】如何防止sql存储过程中的重复更新【英文标题】:How to prevent duplicate update in sql stored procedure 【发布时间】:2017-01-30 11:10:59 【问题描述】:

我在 Sql 和我的项目的插入 Form 中有这张表,我阻止用户为相同的 HNumber 输入相同的 HDate

RecID       HDate        HNumber     HComb
----------------------------------------------
1           2017-1-30       1          12
3           2017-1-29       1          15
5           2017-1-30       2          12
6           2017-1-30       3          12
9           2017-1-30       4          12

但在编辑表单中我不知道如何防止这种情况,

我在存储过程中尝试此代码,但它适用于某些 HNumber,但它会阻止其他一些 HNumber 在它自己的日期中被编辑

Create Procedure UpdCombHarByRecID

@RecID int,
@HarvestDate Date,
@HiveNumber int,
@HoneyComb Float, 

as

if NOT Exists (Select * From tHoneyHarvest Where RecID=@RecID)
return 0   
//there is no record to be updated

if Exists (Select * From tHoneyHarvest Where HarvestDate=@HarvestDate AND
 HiveNumber=HiveNumber And
 RecID!=@RecID) 
 // I hoped this should do the job 
 //(RecID is PrimaryKey and it is identity)
return 2

Update tHoneyHarvest 

Set HarvestDate=@HarvestDate,
HoneyType=@HoneyType,
HoneyComb=@HoneyComb,
HoneyDetails=@HoneyDetails

Where RecID=@RecID
return 1

现在问题出在哪里?

【问题讨论】:

使用 single UPDATE...FROM...WHERE 语句,其WHERE 子句可消除重复项。多个Exists 语句只会使代码更难阅读和理解。 @PanagiotisKanavos 用户无法更改 HNumber,但可以编辑 HDate,我想检查 HNumber 是否已经在新编辑的 HDate 中有记录,以防止更新任何字段并且什么都不做 HiveNumber=HiveNumber 将始终为真。应该是 HiveNumber=@HiveNumber? 您可以在 Hdate 和 HNumber 列上创建唯一索引。检查这篇文章***.com/questions/11754754/… @SaraniO 你应该做的是从 SSMS "CREATE UNIQUE INDEX IX_Date_Number ON tHoneyHarvest (HDate, HNumber);" 启动这样的命令当您尝试在 2 个索引字段上输入相同的两次相同的日期时,您将获得异常,在这里您可以找到 microsoft 文档 msdn.microsoft.com/en-us/library/ms187019.aspx 【参考方案1】:

最好的方法是使用非聚集索引。非聚集索引在插入或更新发生时防止重复记录。

CREATE UNIQUE INDEX MyIndex ON ExcelTable(HDate, HNumber)

请参考

https://supportline.microfocus.com/documentation/books/sx50/rhsqlx1s.htm

Add unique constraint to combination of two columns

【讨论】:

【参考方案2】:

感谢评论中的帮助。问题是由于程序中的拼写错误造成的。

if Exists (Select * From tHoneyHarvest Where HarvestDate=@HarvestDate AND
  HiveNumber=@HiveNumber And
  RecID!=@RecID) 

我忘记在 HiveNumber 之前添加 @

【讨论】:

以上是关于如何防止sql存储过程中的重复更新的主要内容,如果未能解决你的问题,请参考以下文章

带参数的存储过程如何防止 SQL 注入

oracle中的存储过程有啥作用,该怎么理解?(数据更新的话用update语句不就完了吗)

什么是存储过程?有什么优点?

在 ASP.NET MVC 中执行 SQL Server 存储过程时如何防止超时错误?

sql存储过程有什么用

如何修复存储过程 Oracle PL/SQL 的错误?