【问题标题】:Stop Inserting in Table if record already exists如果记录已存在,则停止在表中插入
【发布时间】:2010-11-26 04:06:46
【问题描述】:

我有sql server程序,请看下面。

ALTER PROCEDURE [dbo].[uspInsertDelegate]
(
    @CourseID int,
    @CPUserID int,
    @StatusID int,
    @CreateUser varchar(25)

)
AS
    SET NOCOUNT OFF;
INSERT INTO tblDelegate                      
(
    CourseID, 
    CPUserID, 
    StatusID, 
    CreateUser 

)
VALUES     
(
    @CourseID,
    @CPUserID,
    @StatusID,
    @CreateUser
)

RETURN

现在我不想插入表 tblDelegate 如果插入 courseidcpuserid 对于表 tblDelegate 中的记录相同

【问题讨论】:

标签: sql sql-server tsql error-handling try-catch


【解决方案1】:

courseidcpuuserid 列添加唯一键 约束。

如果你尝试插入一个骗子,你会得到一个密钥冲突。

除此之外,您还可以在使用存储过程插入值之前测试该值是否存在。

BEGIN TRAN

SELECT 1 
FROM tblDelegate WITH (TABLOCK) 
WHERE CourseId=@CourseID 
      AND CPUserID=@CPUserId
IF @@rowcount = 0
BEGIN
--Record doesn't already exist
--Insert it
END

COMMIT

【讨论】:

    【解决方案2】:

    先简单测试一下。在 SQL Server 2005 中,您还可以尝试/捕获来忽略重复错误。

    IF NOT EXISTS (SELECT *
            FROM tblDelegate
            WHERE CourseID = @CourseID etc)
        INSERT INTO tblDelegate                      
        (
            CourseID, 
            CPUserID, 
            StatusID, 
            CreateUser 
    
        )
        VALUES     
        (
            @CourseID,
            @CPUserID,
            @StatusID,
            @CreateUser
        )
    

    请问:您的意思是“SET NOCOUNT ON”吗?

    【讨论】:

    • 这对于并发来说是不安全的,如果并发高,你会被骗。
    • 总是值得添加唯一键约束并使用适当的锁定级别。
    • @Sam:是的,看到它发生了,但在很多情况下都可以。 @pjp:PK 通常是唯一约束
    【解决方案3】:

    您使用的是什么版本的 SQL Server?如果您在 2008 年,请查看 MERGE 语句。

    使用第一个答案中指出的 IF NOT Exists 子句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      • 2021-09-03
      • 2018-12-26
      相关资源
      最近更新 更多