Mysql select 语句能返回一个自动生成顺序列吗

Mysql select 语句能返回一个自动生成顺序列吗,第1张

不能,如有唯一标识的字段的话,可以用查询生成生成临时表,用SQL语句altertablettladdidintauto_incrementprimarykey即可生成顺序号mysql中没有类似的函数,但可以用变量实现:set@n=0select(@n:=@n+1)asid,字段名

确定结果标识符之后,从Redis读数据或向Redis写数据的思路就很清晰了。对于一个sql语句格式的数据请求,首先计算该语句的MD5并据此得到结果集标识符,然后利用该标识符在Redis中查找该结果集。注意,结果集中的每一行都有一个相应的键,这些键都存储在一个Redis集合结构中。这个集合恰好对应了所需的结果集,所以,该集合的键必须包含结果集标识符。如果Redis中不存在这样一个集合,说明要找的结果集不在Redis中,所以需要执行相应的sql语句,在Mysql中查询到相应的结果集,然后按照上面所说的办法把结果集中的每一行以字符串或哈希的形式存入Redis。在Redis中查找相应结果集的代码如下:

// 该函数根据sql语句在Redis中查询相应的结果集,并返回结果集中每一行所对应的数据结构的键

vector<string>GetCache(sql::Connection *mysql_connection,

redisContext *redis_connection,

const string &sql, int ttl, int type) {

vector<string>redis_row_key_vector

string resultset_id = md5(sql) // 计算sql语句的md5,这是唯一标识结果集的关键

// type==1时,该函数将查询相应的STRING集合或将结果集写入若干STRING

string cache_type = (type == 1) ? "string" : "hash"

// 根据type信息和结果集标识符合成SET键

string redis_row_set_key = "resultset." + cache_type + ":" + resultset_id

redisReply *reply

// 尝试从reply中获取SET中保存的所有键

reply = static_cast<redisReply*>(redisCommand(redis_connection,

"SMEMBERS %s",

redis_row_set_key.c_str()))

if (reply->type == REDIS_REPLY_ARRAY) {

// 如果要找的SET不存在,说明Redis中没有相应的结果集,需要调用Cache2String或

// Cache2Hash函数把数据从Mysql拉取到Redis中

if (reply->elements == 0) {

freeReplyObject(reply)

sql::Statement *stmt = mysql_connection->createStatement()

sql::ResultSet *resultset = stmt->executeQuery(sql)

if (type == 1) {

redis_row_set_key = Cache2String(mysql_connection, redis_connection,

resultset, resultset_id, ttl)

} else {

redis_row_set_key = Cache2Hash(mysql_connection, redis_connection,

resultset, resultset_id, ttl)

}

// 再次尝试从reply中获取SET中保存的所有键

reply = static_cast<redisReply*>(redisCommand(redis_connection,

"SMEMBERS %s",

redis_row_set_key.c_str()))

delete resultset

delete stmt

}

// 把SET中的每个STRING或HASH键存入redis_row_key_vector中

string redis_row_key

for (int i = 0i <reply->elements++i) {

redis_row_key = reply->element[i]->str

redis_row_key_vector.push_back(redis_row_key)

}

freeReplyObject(reply)

} else {

freeReplyObject(reply)

throw runtime_error("FAILURE - SMEMBERS error")

}

return redis_row_key_vector

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7334906.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-04
下一篇 2023-04-04

发表评论

登录后才能评论

评论列表(0条)

保存