在这个MySQL过程中,我怎样才能在列名称中保持干燥?

在这个MySQL过程中,我怎样才能在列名称中保持干燥?,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,我正在引用meta表的name、description和user\u id列。两次,将来可能更多(谁知道呢?)。这些列用于计算我的元资源的ETag 在将来添加一个有助于计算ETag的列将迫使我更改代码N次,这是不好的 有没有办法让它变干并把这些列名存放在别处?因为我想在执行meta上的INSERT时也使用这些列名 如果only=true则 --仅在元字段上计算ETag 更新元 设置etag=etag(CONCAT(名称、描述、用户id)) 其中id=元id; 其他的 --计算元字段和元客户上的E

我正在引用
meta
表的
name
description
user\u id
列。两次,将来可能更多(谁知道呢?)。这些列用于计算我的元资源的ETag

在将来添加一个有助于计算ETag的列将迫使我更改代码N次,这是不好的

有没有办法让它变干并把这些列名存放在别处?因为我想在执行meta上的
INSERT
时也使用这些列名

如果only=true则
--仅在元字段上计算ETag
更新元
设置etag=etag(CONCAT(名称、描述、用户id))
其中id=元id;
其他的
--计算元字段和元客户上的Etag
开始
声明c_etags VARCHAR(32);
--计算c_etags
更新元
SET etag=etag(CONCAT(etag(名称、描述、用户id)、c_etag))
其中id=元id;
结束;
如果结束;
免责声明:这段代码未经测试,除了简单的语句之外,我对MySQL的东西还很陌生

EDIT
etag
MD5
MySQL函数。也许这是一种选择:

CREATE PROCEDURE set\u meta\u etag(在meta\u id INT中,在相关文本中)
不确定
开始
更新元
设置etag=etag(CONCAT(名称、说明、用户id、,
如果(related不为空,related,“”)
其中id=元id;
结束//
--第一个电话
调用set_meta_etag(meta_id,NULL);
--第二次呼叫
调用集合meta_etag(meta_id,c_etag);
但是它不适用于
INSERT
语句。

显而易见的一点(对于每一列,如果它是我想要的,请使用它来帮助制作etag)在SQL中无法轻松工作,因为SQL历史上不考虑存储在变量中的列名

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

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

有关如何在存储过程中
准备
执行
语句的信息

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

information_schema.COLUMNS.COLUMN_COMMENT

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

如果您知道这仅限于一个表,可以添加触发器。使用
AFTER
触发器应允许存储的进程同时适用于
INSERT
UPDATE
。看