我正在引用 name
表的 description
、 user_id
和 meta
列。两次,将来可能会更多(谁知道?)。这些列用于计算我的元资源的 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 的东西还很陌生。
编辑 :
etag
是 MD5
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
有关如何在存储过程中使用 PREPARE
和 EXECUTE
语句的信息。
顺便说一句,我已经成功构建了在列内容中存储了各种元数据的系统。例如,您可以编写代码来查找列内容中的字符串 '[etag]'。列的注释存储在
information_schema.COLUMNS.COLUMN_COMMENT
并且在您的程序启动时非常容易处理。
关于mysql - 如何在此 MySQL 过程中的列名称中保持 DRY?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12027377/