需求:
业务开发一个时间轴功能MySQL 序列使用,时间轴上展示多个表的数据,时间轴滚动刷新。
问题: 获取多个表中的前几条数据比较麻烦,需要将多个表的数据拿出来排序然后limit 取数据。这样多表取数据如果数据量大很麻烦,
比如要取前5-10条数据,需要取表A的0-10 和表B的0-10然后合并,取前五。这样会搜索出冗余数据。多个表按时间排序时间可能重复,所以以时间为分界值截取数据容易造成数据记录丢失。 解决:
分析以上问题,决定让多个表的id 字段取自同一个序列,这样就可以直接用 id 在两个表中搜索排序,业务实现难度大大降低。
当然这样也不是最好解决方案,因为这样搜出来的两个表的数据还是需要合并排序,然后取前几,只是搜索结果比较少,内存中处理的数据量比较小而已。
最好的解决方案就是,在表设计的时候规避这个操作,规避掉多表搜索。把握好面向对象的思想,划分好对象。
mysql 中创建自增的序列(Sequence)
由于mysql和oracle不太一样,不支持直接的sequence,所以需要创建一张table来模拟sequence的功能。
1.创建sequence表
CREATE TABLE `sequence` (
`name` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '序列的名字',
`current_value` int(11) NOT NULL COMMENT '序列的当前值',
`increment` int(11) NOT NULL DEFAULT '1' COMMENT '序列的自增值',
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
2.创建–取当前值的函数
BEGIN
DECLARE value INTEGER;
SET value = 0;
SELECT current_value INTO value
FROM sequence
WHERE name = seq_name;
RETURN value;
END
3.创建–取下一个值的函数
DROP FUNCTION IF EXISTS nextval;
DELIMITER $
CREATE FUNCTION nextval (seq_name VARCHAR(50))
RETURNS INTEGER
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
UPDATE sequence
SET current_value = current_value + increment
WHERE name = seq_name;
RETURN currval(seq_name);
END
$
DELIMITER ;
4.创建–更新当前值的函数
DROP FUNCTION IF EXISTS setval;
DELIMITER $
CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)
RETURNS INTEGER
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
UPDATE sequence
SET current_value = value
WHERE name = seq_name;
RETURN currval(seq_name);
END
$
DELIMITER ;

5.测试
执行sql
INSERT INTO sequence VALUES ('testSeq', 0, 1);
SELECT SETVAL('testSeq', 10);
SELECT CURRVAL('testSeq');
SELECT NEXTVAL('testSeq');
本文参考自:
(编辑:通辽站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|