Упрощение обновления / вставки условного SQL - PullRequest
0 голосов
/ 24 января 2019

У меня есть следующая хранимая процедура, которая берет ключ и временную метку и обновляет временную метку, используя ключ, если ключ уже существует, в противном случае он вставляет ключ вместе с сопровождающим значением временной метки:

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 голосов
/ 24 января 2019

Вы хотите 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 устанавливает Timestamp для вставляемого значения, когда Name уже существует.

Для этогодля работы вам нужен уникальный индекс / ограничение для 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;

Я предпочитаю usp_, а не sp_ из-за моей истории использования SQL Server, где sp_ не рекомендуется, поскольку он используется для системных хранимых процедур.Это просто привычка и не имеет отношения к MySQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...