mysql 日期+自增序列作为varchar类型的自增id

过往不在 2017-11-02 03:34:52
有父表Fathertable, 有一个字段FatheruserId 为主键,--
-- 有子表childtable, 有一个字段FatheruserId和userId,userId为主键,FatheruserId为外键,--


-- 想实现父表FatheruserId为当前日期+自增序列,例如201711020000001,201711020000002,201711020000003 --

-- 子表做成一个父id最多有20个子用户,并且每次新加父id,子id都是从1开始增加 实现为下图的样式。
一点思路都没有,谁那里有相似的例子可以看看吗,想要一个具体的思路。谢谢你
子表样式
父表样式

...全文
819 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wtujedp 2017-11-03
  • 打赏
  • 举报
回复
/* sp_demo 存储过程用来生成流水号。 IDInfo 存储流水号生成的规则及最后一次生成的值。 存储过程调用说明 call sp_demo('order','D',4) */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- 表:流水号存储表 -- ---------------------------- DROP TABLE IF EXISTS `IDInfo`; CREATE TABLE `IDInfo` ( `IDName` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , `MaxID` int(11) NOT NULL , `IDDate` datetime NULL DEFAULT NULL , `IDType` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , `IDLen` int(11) NOT NULL , `IDValue` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , PRIMARY KEY (`IDName`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci ; -- ---------------------------- -- 流水号生成测试表,保存不能生成重复的值。 -- ---------------------------- DROP TABLE IF EXISTS `newid`; CREATE TABLE `newid` ( `id` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci ; -- ---------------------------- -- 存储过程:生成流水号 -- id_name_new 流水号名称 -- id_type_new 生成类型(默认:D) ------Y 2017 ------M 201701 ------D 20170101 -- id_len_new 生成末尾长度(4-8位) -----0001 -----00000001 -- ---------------------------- DROP PROCEDURE IF EXISTS `sp_demo`; DELIMITER ;; CREATE DEFINER=`chinajey`@`%` PROCEDURE `sp_demo`(in id_name_new VARCHAR(50),in id_type_new char(1),in id_len_new int) BEGIN DECLARE vRet VARCHAR(16) DEFAULT ''; declare max_id_temp int default 1; declare id_type_old char(1) default ''; declare id_date_old datetime; declare id_len_old int default 0; DECLARE year char(4) DEFAULT cast(year(now()) AS CHAR(4)); -- 当前时间年 DECLARE month char(2) DEFAULT lpad(cast(month(now()) AS CHAR(2)),2,'0'); -- 当前时间月(不足2位,左边用0补) DECLARE day char(2) DEFAULT lpad(cast(day(now()) AS CHAR(2)),2,'0'); -- 当前时间天(不足2位,左边用0补) set id_name_new=ucase(id_name_new); set id_type_new=ucase(id_type_new); IF id_len_new<4 or id_len_new>8 then set id_len_new=4; END IF; IF id_type_new!='Y'or id_type_new!='M'then set id_type_new='D'; END IF; select MaxID,IDType,IDDate,IDLen into max_id_temp,id_type_old,id_date_old,id_len_old from IDInfo where IDName=id_name_new LIMIT 1 for UPDATE; -- select max_id_temp,id_type_old,id_date_old,id_len_old; IF id_type_old is not null&& id_type_old!='' THEN set id_type_new=id_type_old; END IF ; IF id_len_old is not null &&id_len_old!=0 THEN set id_len_new=id_len_old; END IF ; IF ucase(id_type_new) = 'Y' THEN IF YEAR(now())!=YEAR(id_date_old) THEN SET max_id_temp=1;END IF ; SET vRet=CONCAT(year,lpad(cast(max_id_temp as char(8)),id_len_new,'0')); SET max_id_temp=max_id_temp+1; END IF ; IF ucase(id_type_new) = 'M' THEN IF YEAR(now())!=YEAR(id_date_old) OR MONTH(now())!=MONTH(id_date_old) THEN SET max_id_temp=1;END IF ; SET vRet=CONCAT(year,month,lpad(cast(max_id_temp as char(8)),id_len_new,'0')); SET max_id_temp=max_id_temp+1; END IF ; IF ucase(id_type_new) = 'D' THEN if YEAR(now())!=YEAR(id_date_old) OR MONTH(now())!=MONTH(id_date_old) OR DAY(now())!=DAY(id_date_old) THEN SET max_id_temp=1;END IF ; SET vRet=CONCAT(year,month,day,lpad(cast(max_id_temp as char(8)),id_len_new,'0')); SET max_id_temp=max_id_temp+1; END IF ; START TRANSACTION ; IF id_date_old IS NULL THEN INSERT INTO IDInfo SELECT id_name_new,max_id_temp,now(),UCASE(id_type_new),id_len_new,vRet; ELSE UPDATE IDInfo SET MaxID=max_id_temp,IDDate=now(),IDValue=vRet WHERE IDName=id_name_new; END IF ; COMMIT ; insert into newid select vRet; select vRet; END ;; DELIMITER ; -- ---------------------------- -- 存储过程:循环1分钟执行某一任务 -- ---------------------------- DROP PROCEDURE IF EXISTS `test`; DELIMITER ;; CREATE DEFINER=`chinajey`@`%` PROCEDURE `test`() BEGIN declare bdt datetime default NOW(); declare edt datetime default date_add(NOW(), interval 1 minute); while (NOW()<=edt) do call sp_demo('test','Y',5); end WHILE; END ;; DELIMITER ;
二月十六 2017-11-02
  • 打赏
  • 举报
回复
前两天好像还看见有人问这个问题着…给表加一个自增列,然后父id as now() +id 大概这么个思路

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧