如何在MySQL程序中的列名中进行DRY?

gre*_*emo 5 mysql sql stored-procedures

我是referencig name,description和user_id列的meta表.未来两次,也许更多(谁知道?).这些列用于计算元资源的ETag.

添加一个有助于计算ETag的列将迫使我将代码更改N次,这很糟糕.

有没有办法让它干并将这些列名存储在别处?因为我想INSERT在执行meta 时也使用这些列名.

IF only = true THEN
    -- Calculate ETag on meta fields only
    UPDATE meta
    SET etag = etag(CONCAT(name, description, user_id))
    WHERE id = meta_id;
ELSE
    -- Calculate Etag on meta fields and meta customers
    BEGIN
        DECLARE c_etags VARCHAR(32);

        -- Compute c_etags

        UPDATE meta
        SET etag = etag(CONCAT(etag(name, description, user_id), c_etags))
        WHERE id = meta_id;
    END;
END IF;
Run Code Online (Sandbox Code Playgroud)

免责声明:这段代码是未经测试的,除了简单的陈述之外,我对MySQL的东西很新.

编辑:etag是MD5MySQL功能.也许这是一个选择:

CREATE PROCEDURE set_meta_etag(IN meta_id INT, IN related TEXT)
    NOT DETERMINISTIC
BEGIN
    UPDATE meta
    SET etag = etag(CONCAT(name, description, user_id,
        IF(related IS NOT NULL, related, '')))
    WHERE id = meta_id;
END //

-- First call
CALL set_meta_etag(meta_id, NULL);

-- Second call
CALL set_meta_etag(meta_id, c_etags);
Run Code Online (Sandbox Code Playgroud)

但它不适用于INSERT声明.