简化更新/插入条件条件SQL

时间:2019-01-24 12:05:53

标签: mysql sql

我有以下存储过程,该过程需要一个键和一个时间戳,如果该键已经存在,则使用该键更新时间戳,否则它将插入键以及随附的时间戳值:

CREATE PROCEDURE `sp_AddUpdateTimestamp`(IN timestampKey VARCHAR(50), IN timestampValue TIMESTAMP)
BEGIN
IF(timestampKey IS NOT NULL) THEN
    IF(timestampValue IS NOT NULL) THEN
        IF EXISTS (SELECT Name FROM StoredTimestamps WHERE Name = timestampKey) THEN
            UPDATE StoredTimestamps SET Timestamp = timestampValue WHERE Name = timestampKey;
        ELSE 
            INSERT INTO StoredTimestamps (Name, Timestamp) VALUES (timestampKey, timestampValue);
        END IF;
    ELSE
        IF EXISTS (SELECT Name FROM StoredTimestamps WHERE Name = timestampKey) THEN
            UPDATE StoredTimestamps SET Timestamp = NOW() WHERE Name = timestampKey;
        ELSE
            INSERT INTO StoredTimestamps (Name, Timestamp) VALUES (timestampKey, NOW());
        END IF;
    END IF;
END IF;
END

对我来说,这是很多条件逻辑,使此过程非常冗长。有谁知道这种逻辑可以简化的方法?

1 个答案:

答案 0 :(得分:3)

您要INSERT ON DUPLICATE KEY UPDATE

INSERT INTO StoredTimestamps (Name, Timestamp)
    VALUES (timestampKey, COALESCE(timestampValue, NOW()) )
    ON DUPLICATE KEY UPDATE Timestamp = VALUES(timestampValue);

ON DUPLICATE KEY已经存在的情况下,TimestampName设置为要插入的值。

要使其正常工作,您需要在Name上使用唯一的索引/约束:

ALTER TABLE StoredTimestamps ADD CONSTRAINT unq_StoredTimestamps_Name UNIQUE (Name);

在存储过程中,我还要注意命名约定:

CREATE PROCEDURE usp_AddUpdateTimestamp (
    IN in_timestampKey VARCHAR(50),
    IN in_timestampValue TIMESTAMP)
)
BEGIN
    INSERT INTO StoredTimestamps (Name, Timestamp)
        VALUES (in_timestampKey, COALESCE(in_timestampValue, NOW()))
        ON DUPLICATE KEY UPDATE Timestamp = VALUES(timestampValue)
END;

由于我使用SQL Server的历史,因此我更喜欢usp_而不是sp_,在此不建议使用sp_,因为它用于系统存储过程。这只是一个习惯,与MySQL无关。