| 
                        
                         需求: 
业务开发一个时间轴功能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');
 
本文参考自: 
                                                (编辑:泰州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |