检查记录是不是存在,如果是,则“更新”,如果不“插入”

Posted

技术标签:

【中文标题】检查记录是不是存在,如果是,则“更新”,如果不“插入”【英文标题】:Check if record exists, if yes "update" if not "insert"检查记录是否存在,如果是,则“更新”,如果不“插入” 【发布时间】:2011-03-12 11:36:42 【问题描述】:

我想检查表 PREMIUM_SERVICE_USER 是否存在任何记录 如果strClientID 没有记录插入到premium_service_user 表,则strClientID 更新timeValid 为+30。

我做错了什么?

它增加了timeValid +30 天,但也插入了另一行。

SELECT @pre_var = count(*) 
FROM PREMIUM_SERVICE_USER 
WHERE strClientID = @strClientID

/* bronze premium - 200 cash */
IF @Premium = 1
BEGIN
    INSERT INTO PREMIUM_SERVICE_USER 
        (strClientID, timeReg, timeValid, bCurrent, durum) 
    VALUES 
        (@strClientID,getdate(),getdate() + 30,'1','1')

    UPDATE TB_USER 
    SET cash = cash+200 
    WHERE strAccountID = @strClientID
END

IF @Premium = 1 AND @pre_var = 1
BEGIN
    UPDATE PREMIUM_SERVICE_USER 
        SET timevalid = timevalid+30 where strClientID = @strClientID
    UPDATE PREMIUM_SERVICE_USER 
        SET bCurrent = 1 where strClientID = @strClientID
    UPDATE TB_USER 
        SET cash = cash+200 WHERE strAccountID = @strClientID
END

【问题讨论】:

除了下面找到的修复之外,我还建议您将 UPDATE 语句合并到 PREMIUM_SERVICE_USER 的单个语句中 【参考方案1】:
CREATE PROCEDURE sp_UpdateProcessed
AS
BEGIN
    DECLARE @Processed_Status NVARCHAR(256)
    SET @Processed_Status = 'ACTIVE'
    IF(@Processed_Status <> 'Processed')
    BEGIN
       SET @Processed_Status = 'Active'
       UPDATE ST_JnlMediumMoveNew
       SET ST_JnlMediumMoveNew.Process_Status = @Processed_Status 
    END
END

【讨论】:

【参考方案2】:

您在计算行数,但没有在您的决策中使用它。这是一个可能有用的决策结构

Select @pre_var = count(*) From PREMIUM_SERVICE_USER Where strClientID = @strClientID

IF @pre_var = 0
BEGIN
    /* Run Insert Code Here */
END
ELSE
BEGIN
    /* Run Update Code Here */
END


IF @Premium = 1 
BEGIN
    /* Run Premier Members Update Code Here */
END
ELSE
BEGIN
    /* Run Non-Premier Members Update Code Here */
END

或者这个..

IF @pre_var = 0
BEGIN
    /* Run Insert Code Here */
END
ELSE
BEGIN
    IF @Premium = 1 
    BEGIN
        /* Run Premier Members Update Code Here */
    END
    ELSE
    BEGIN
        /* Run Non-Premier Members Update Code Here */
    END
END

【讨论】:

但如果 count 返回我 1 表示记录存在于表中。我想做的是如果表上存在行进行更新。你的建议不意味着如果 count 返回 0 会更新吗?【参考方案3】:

看起来您在第一个 IF 语句中检查了错误的变量。如果@Premium = 1 那么你会看到这种行为。

/* bronze premium - 200 cash */
IF @pre_var = 0
BEGIN
INSERT INTO PREMIUM_SERVICE_USER (strClientID, timeReg, timeValid, bCurrent, durum) VALUES (@strClientID,getdate(),getdate() + 30,'1','1')
UPDATE TB_USER SET cash = cash+200 WHERE strAccountID = @strClientID
END

IF @Premium = 1 AND @pre_var = 1
BEGIN
update PREMIUM_SERVICE_USER set timevalid = timevalid+30 where strClientID = @strClientID
update PREMIUM_SERVICE_USER set bCurrent = 1 where strClientID = @strClientID
UPDATE TB_USER SET cash = cash+200 WHERE strAccountID = @strClientID
END

【讨论】:

【参考方案4】:

您的问题是运行第一个 if 而不考虑 @pre_var 的值。

这是一种稍微不同的方法,如果PREMIUM_SERVICE_USER 很大,效率会稍微高一些。

if @Premium = 1
  begin
    if exists(Select 1 From PREMIUM_SERVICE_USER Where strClientID = @strClientID)
      BEGIN
        update PREMIUM_SERVICE_USER set timevalid = timevalid+30 where strClientID = @strClientID
        update PREMIUM_SERVICE_USER set bCurrent = 1 where strClientID = @strClientID
        UPDATE TB_USER SET cash = cash+200 WHERE strAccountID = @strClientID
       END
    ELSE
      BEGIN
        INSERT INTO PREMIUM_SERVICE_USER (strClientID, timeReg, timeValid, bCurrent, durum) VALUES (@strClientID,getdate(),getdate() + 30,'1','1')
        UPDATE TB_USER SET cash = cash+200 WHERE strAccountID = @strClientID
       END
  end

【讨论】:

以上是关于检查记录是不是存在,如果是,则“更新”,如果不“插入”的主要内容,如果未能解决你的问题,请参考以下文章

检查模板中是不是存在变量,如果不存在则不会在记录器中导致错误

替代监视器来检查记录是不是存在,如果不存在则写入

SQL Select:如果存在则更新,如果不存在则插入 - 使用日期部分比较?

如何检查记录是不是已经存在,然后在 laravel 中更新或插入?

如果不存在则插入,否则在 Netezza 中更新

检查表1中是不是存在记录的优化方法。如果没有则检查表2,否则返回默认值