我有以下存储过程,该过程需要一个键和一个时间戳,如果该键已经存在,则使用该键更新时间戳,否则它将插入键以及随附的时间戳值:
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
对我来说,这是很多条件逻辑,使此过程非常冗长。有谁知道这种逻辑可以简化的方法?
答案 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
已经存在的情况下,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;
由于我使用SQL Server的历史,因此我更喜欢usp_
而不是sp_
,在此不建议使用sp_
,因为它用于系统存储过程。这只是一个习惯,与MySQL无关。