function.sql 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. CREATE TABLE `plat_sequence` (
  2. `name` varchar(32) NOT NULL COMMENT '序列编码',
  3. `current_value` int(11) DEFAULT 1000 COMMENT '当前值/初始值',
  4. `increment` int(11) DEFAULT NULL COMMENT '步增值',
  5. `remark` text DEFAULT NULL COMMENT '备注',
  6. `created_by` int(11) NOT NULL COMMENT '创建者',
  7. `created_name` varchar(90) NOT NULL COMMENT '创建人',
  8. `created_time` datetime NOT NULL COMMENT '创建时间',
  9. `updated_by` int(11) DEFAULT NULL COMMENT '更新者',
  10. `updated_name` varchar(90) DEFAULT NULL COMMENT '更新人',
  11. `updated_time` datetime DEFAULT NULL COMMENT '更新时间',
  12. `deleted_time` datetime DEFAULT NULL COMMENT '删除时间',
  13. PRIMARY KEY (`name`) USING BTREE
  14. ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '序列信息表' ;
  15. DROP FUNCTION IF EXISTS nextval;
  16. DELIMITER $
  17. CREATE FUNCTION nextval (seq_name VARCHAR(50)) RETURNS INTEGER LANGUAGE SQL DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT '' BEGIN
  18. UPDATE plat_sequence
  19. SET current_value = current_value + increment
  20. WHERE name = seq_name;
  21. RETURN currval(seq_name);
  22. END $
  23. DELIMITER ;
  24. alter table plat_sequence add `year` int(11) DEFAULT NULL COMMENT '年份' after increment;
  25. update plat_sequence set year=2023,current_value=49 where name = 'contract_code'
  26. DROP FUNCTION IF EXISTS next_year_reset_val;
  27. DELIMITER $
  28. CREATE FUNCTION next_year_reset_val (seq_name VARCHAR(50)) RETURNS INTEGER LANGUAGE SQL DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT '' BEGIN
  29. UPDATE plat_sequence SET current_value=0, `year`=year(now()) WHERE `year` = year(now())-1;
  30. UPDATE plat_sequence SET current_value=current_value+increment WHERE name = seq_name;
  31. RETURN currval(seq_name);
  32. END $
  33. DELIMITER ;
  34. DROP FUNCTION IF EXISTS currval;
  35. DELIMITER $
  36. CREATE FUNCTION `currval`(seq_name VARCHAR(50)) RETURNS int(11)
  37. DETERMINISTIC
  38. BEGIN
  39. DECLARE VALUE INTEGER;
  40. SET VALUE = 0;
  41. SELECT current_value INTO VALUE
  42. FROM plat_sequence
  43. WHERE NAME = seq_name;
  44. RETURN VALUE;
  45. END $
  46. DELIMITER ;
  47. -- 添加日期字段(用于按天重置)
  48. alter table plat_sequence add `day` date DEFAULT NULL COMMENT '日期' after `year`;
  49. -- 创建按天重置序列号的函数
  50. DROP FUNCTION IF EXISTS next_day_reset_val;
  51. DELIMITER $
  52. CREATE FUNCTION next_day_reset_val (seq_name VARCHAR(50)) RETURNS INTEGER LANGUAGE SQL DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT '' BEGIN
  53. -- 如果日期不是今天,重置序列为0
  54. UPDATE plat_sequence SET current_value=0, `day`=CURDATE() WHERE `day` IS NULL OR `day` != CURDATE();
  55. -- 递增序列号
  56. UPDATE plat_sequence SET current_value=current_value+increment WHERE name = seq_name;
  57. RETURN currval(seq_name);
  58. END $
  59. DELIMITER ;
  60. -- INSERT INTO plat_sequence VALUES ('customer_code', 1000, 1, '', 1000, '系统管理员', '2023-02-09 10:27:42', null, null, null, null);
  61. -- INSERT INTO plat_sequence VALUES ('contract_code', 1000, 1, '', 1000, '系统管理员', '2023-02-09 10:27:42', null, null, null, null);
  62. -- INSERT INTO plat_sequence VALUES ('consult_code', 1000, 1, null, '', 1000, '系统管理员', '2023-02-09 10:27:42', null, null, null, null);
  63. -- select `nextval`('customer_code');