我正在引用 name 表的 descriptionuser_idmeta 列。两次,将来可能会更多(谁知道?)。这些列用于计算我的元资源的 ETag。

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

有什么方法可以使它干燥并将这些列名存储在其他地方?因为在执行 INSERT on 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;

免责声明:此代码未经测试,除了简单的语句外,我对 MySQL 的东西还很陌生。

编辑 :etagMD5 MySQL 函数。也许这是一种选择:

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);

但它不适用于 INSERT 语句。

最佳答案

显而易见的事情(foreach 列,如果它是我想要的,使用它来帮助制作 etag)在 SQL 中无法轻松工作,因为 SQL 从历史上看不会考虑存储在变量中的列名。

您可以使用您最喜欢的非 SQL 编程语言(Java、PHP 等)编写程序来创建并定义您的过程。

如果您愿意做这项工作并承担轻微的性能损失,您也可以使用所谓的“动态 sql”来执行此操作。看

How To have Dynamic SQL in MySQL Stored Procedure

有关如何在存储过程中使用 PREPAREEXECUTE 语句的信息。

顺便说一句,我已经成功构建了在列内容中存储了各种元数据的系统。例如,您可以编写代码来查找列内容中的字符串 '[etag]'。列的注释存储在

information_schema.COLUMNS.COLUMN_COMMENT

并且在您的程序启动时非常容易处理。

关于mysql - 如何在此 MySQL 过程中的列名称中保持 DRY?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12027377/

10-14 14:02
查看更多