5

我是referencigname和表格descriptionuser_idmeta。未来两次,甚至更多(谁知道?)。这些列用于计算我的元资源的 ETag。

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

有没有办法让它干燥并将这些列名存储在其他地方?因为我想INSERT在执行元数据时也使用这些列名。

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 的东西很陌生,除了简单的语句。

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

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声明。

4

2 回答 2

0

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

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

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

如何在 MySQL 存储过程中使用动态 SQL

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

顺便说一句,我在构建系统方面取得了很好的成功,这些系统在列内容中存储了各种元数据。例如,您可以编写代码在列内容中查找字符串“[etag]”。列的注释存储在

information_schema.COLUMNS.COLUMN_COMMENT

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

于 2012-08-19T17:50:06.610 回答
0

如果您知道这仅限于一张表,您可以添加一个触发器。使用AFTER触发器应该允许您的存储过程同时适用于INSERTUPDATE。请参阅MySQL Fire Trigger 的 Insert 和 Update

于 2012-09-05T17:45:41.793 回答