首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql日期加流水号为主键

基础概念

MySQL是一种关系型数据库管理系统,广泛应用于各种应用场景中。在MySQL中,主键(Primary Key)是用于唯一标识表中每一行记录的一个或多个字段。主键具有唯一性和非空性。

日期加流水号作为主键是一种常见的设计方式,通常用于需要按时间顺序记录数据的场景,例如日志表、订单表等。

相关优势

  1. 唯一性:日期加流水号的组合可以确保每条记录的唯一性。
  2. 时间顺序:日期部分可以方便地按时间顺序进行查询和排序。
  3. 扩展性:流水号部分可以设计为自增,方便插入新记录。
  4. 查询效率:基于日期的分区可以提高查询效率,特别是在大数据量的情况下。

类型

  1. 日期+流水号:例如YYYYMMDD+自增数字
  2. 日期+时间+流水号:例如YYYYMMDDHHMMSS+自增数字

应用场景

  1. 日志记录:记录系统或应用的日志信息,按时间顺序进行查询和分析。
  2. 订单管理:记录订单信息,按时间顺序进行订单管理和查询。
  3. 交易记录:记录金融交易信息,按时间顺序进行审计和分析。

示例代码

假设我们要创建一个订单表,主键为日期加流水号:

代码语言:txt
复制
CREATE TABLE orders (
    order_id VARCHAR(20) PRIMARY KEY,
    order_date DATE,
    customer_id INT,
    total_amount DECIMAL(10, 2)
);

DELIMITER //

CREATE TRIGGER before_order_insert
BEFORE INSERT ON orders
FOR EACH ROW
BEGIN
    DECLARE order_seq INT;
    SET order_seq = (SELECT IFNULL(MAX(SUBSTRING_INDEX(order_id, '+', -1)), 0) + 1 FROM orders WHERE SUBSTRING_INDEX(order_id, '+', 1) = DATE_FORMAT(NOW(), '%Y%m%d'));
    SET NEW.order_id = CONCAT(DATE_FORMAT(NOW(), '%Y%m%d'), '+', LPAD(order_seq, 6, '0'));
END //

DELIMITER ;

可能遇到的问题及解决方法

  1. 主键冲突:如果同一秒内插入多条记录,可能会导致流水号重复。解决方法是在流水号前加上更多位数,或者使用更精确的时间戳(如毫秒级)。
  2. 性能问题:在大数据量的情况下,基于日期的分区可以提高查询效率,但分区过多也会影响性能。需要根据实际情况进行平衡。
  3. 数据迁移:在进行数据迁移或备份时,需要注意日期格式和流水号的连续性,避免数据丢失或重复。

参考链接

通过以上信息,您可以更好地理解MySQL日期加流水号作为主键的设计方式及其应用场景,并解决可能遇到的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • MySQL 核心模块揭秘 | 32 期 | 插入记录,主键索引冲突什么锁?

    本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。 正文 1....原理分析 insert 语句执行过程中,插入记录到主键索引之前,需要先找插入记录的目标位置。 目标位置为表中主键字段值小于等于新插入记录中主键字段值的最后一条记录之后。...为了防止其它事务更新或者删除这条记录,检查表中记录是否有效之前,InnoDB 会对这条记录共享普通记录锁。 这就是示例 SQL 执行过程中对 的记录共享普通记录锁的原因。...我们可以模拟下这个场景,创建 2 个 MySQL 连接,分别执行 delete 语句和 insert 语句。...事务 247916 想要对 的记录共享普通记录锁被阻塞,进入等待状态。 4. 总结 没有需要总结的内容了。

    9510

    淘宝数据库,主键如何设计的?(文末福利)

    聊一个实际问题:淘宝的数据库,主键是如何设计的? 某些错的离谱的答案还在网上年复一年的流传着,甚至还成为了所谓的MySQL军规。其中,一个最明显的错误就是关于MySQL主键设计。...mysql> CREATE TABLE membermaster -> ( -> cardno CHAR(8) PRIMARY KEY, -- 会员卡号为主键 -> membername varchar...比如,我们有一个销售流水表(trans),记录了所有的销售流水明细。2020 年 12 月 01 日,张三在门店购买了一本书,消费了 89 元。...那么,系统中就有了张三买书的流水记录,如下所示: image-20230705100408722 接着,我们查询一下 2020 年 12 月 01 日的会员销售记录: mysql> SELECT b.membername...门店在添加会员的时候,先到总部 MySQL 数据库中获取这个最大值,在这个基础上 1,然后用这个值作为新会员的“id”,同时,更新总部 MySQL 数据库管理信息表中的当 前会员编号的最大值。

    43930

    流水号当主键不正好么?”

    前言 " 又要开始新项目了,一顿操作猛如虎,梳理流程画图。这不,开始对流程及表结构了。 我:吧啦吧啦吧啦 …… 老大:这个建表为啥还设置个自增 id ?...老大:流水号在你这是唯一索引吧?设置成主键,这样就不用 id 了,还减少一次回表查询? 我:…… (说的好像很有道理,咱也不敢说话。)...MySQL 自增主键而不是使用业务生成的值当做主键。...一般使用手机号、身份证号作为主键等并不能保证顺序性。 流水号一般相对较长,比如 28 位,32 位等,过长的话会二级索引占用空间较多。同时为了业务需求,流水号具有一定的随机性。...相关资料 [1] MySQL 官方文档: https://dev.mysql.com/doc/refman/8.0/en/ [2] 《MySQL 技术内幕 InnoDB 存储引擎》第二版

    1.9K20

    MySQL数据库】数据库的约束

    ​ 目录Mysql约束(constraint)基本介绍主键约束(primary key)自增长约束(auto_increment)非空约束(not null)唯一性约束(unique)默认约束(default...)零填充约束(zerofill)----图片Mysql约束(constraint)基本介绍 MySQL数据库通过约束(constraints)防止无效的数据进入到数据库中,以保护数据的实体完整性...MySQL中主要有六种约束,分别是:主键约束(primary key),非空约束(not null),自增长约束(auto_increment),默认约束(default) ,零填充约束(zerofill...2.一张表只能有一个主键,联合主键也是一个主键自增长约束(auto_increment) 默认情况下,自增长约束(auto_increment)的初始值是 1,每新增一条记录,字段值自动...当使用zerofill 时,默认会自动unsigned(无符号)属性,使用unsigned属性后,数值范围是原值的2倍,例如,有符号为-128~+127,无符号为0~256。

    5.7K40

    推荐学Java——数据表操作

    约束分类 主键约束:primary key 单一主键:一个字段做主键 复合主键:多个字段联合做主键(不建议使用) 主键值类型建议 int bigint char 不建议使用 varchar ,主键一般都是定长的...mySQL日期格式: %Y年 %m 月 %d 日 %h 时 %m 分 %s 秒 str_to_date('日期字符串','日期格式') 比如数据表中员工的入职日期字段 hiredate 的类型是...mysql的标准日期格式存入的,那么查询的时候如果没有特殊要求,可以直接查询。...也可以给列名别名,像下面这样 select 表名的别名.列名1 列名1的别名,表名的别名.列名2 列名2的别名 from 表名 表名的别名; 去重查询 // 查询表中某列数据,并去掉重复值...where pname like '%_%'; 如果要查询的列名中本身有_,那么要把列名中带有_的所有记录查出来,这个时候需要用到转义符号 \ 在某个范围获得值:in // 查出商品编号为

    2.6K20

    DML和DQL

    studentName`as 学生姓名 ,`address` as 学生地址 from `student` where `address` '河南新乡';/*学生地址不等于河南新乡的所有学生*/ /*直接空格后*...数据库 LOWER(str) 将字符串转为小写 SELECT LOWER('MySQL'); 返回:mysql UPPER(str) 将字符串转为大写 SELECT UPPER('MySQL');  返回...创建myschool数据库*/ create database myschool; /*删除数据库myschool*/ drop database myschool; /*删除student表里的主键...`as 学生姓名 ,`address` as 学生地址 from `student` where `address` '河南新乡';/*学生地址不等于河南新乡的所有学生*/ /*直接空格后*...studentName`as 姓名,`address` as 学生地址,'昆明华信' as 学校名称 from `student`; select * from `student`; /*把成绩都降低10%后5

    90010

    流水号当主键不正好么?”

    前言 " 又要开始新项目了,一顿操作猛如虎,梳理流程画图。这不,开始对流程及表结构了。 我:吧啦吧啦吧啦 …… 老大:这个建表为啥还设置个自增 id ?...老大:流水号在你这是唯一索引吧?设置成主键,这样就不用 id 了,还减少一次回表查询? 我:…… (说的好像很有道理,咱也不敢说话。)...MySQL 自增主键而不是使用业务生成的值当做主键。...一般使用手机号、身份证号作为主键等并不能保证顺序性。 流水号一般相对较长,比如 28 位,32 位等,过长的话会二级索引占用空间较多。同时为了业务需求,流水号具有一定的随机性。...相关资料 [1] MySQL 官方文档: https://dev.mysql.com/doc/refman/8.0/en/ [2] 《MySQL 技术内幕 InnoDB 存储引擎》第二版 - <End

    87130

    每天一道大厂SQL题【Day11】微众银行真题实战(一)

    第11题:授信金额统计 需求列表 笔试题目 说明:SQL语法请使用HiveSQL/SparkSQL 1.基于附录《核额流水表》和附录2《借据表》统计下述指标,请提供统计SQL 指标 当日新增 昨日新增...技术群讨论 点击下方卡片关注 联系我进群 或者直接私信我进群 微众银行源数据表附录: 核额流水表 字段名 字段意义 字段类型 ds 日期分区,样例格式为20200101,每个分区有全量流水 string...sno 每个ds内主键流水号 string uid 户id string is_risk_apply 是否核额申请(核额漏斗第一步)取值0和1 bigint is_pass_rule 是否通过规则(...,样例格式为20200101每个分区有全量借据 strng duebilid 借据号(每个日期分区内的主键) strng uid 用户id string prod_type 产品名称仅3个枚举值XX...,样例格式为20200101增量表部分流水记录可能有更新 strng sno 流水号,主键 strng create time 创建日期样例格式为2020-10-10 00:10:30与sno唯一绑定,

    77920

    每天一道大厂SQL题【Day13】微众银行真题实战(三)

    ', sno comment '流水号', uid comment '用户id', is_risk_apply comment '是否核额申请', is_pass_rule comment '是否通过规则...技术群讨论 点击下方卡片关注 联系我进群 或者直接私信我进群 微众银行源数据表附录: 核额流水表 字段名 字段意义 字段类型 ds 日期分区,样例格式为20200101,每个分区有全量流水 string...sno 每个ds内主键流水号 string uid 户id string is_risk_apply 是否核额申请(核额漏斗第一步)取值0和1 bigint is_pass_rule 是否通过规则(...,样例格式为20200101每个分区有全量借据 string duebilid 借据号(每个日期分区内的主键) string uid 用户id string prod_type 产品名称仅3个枚举值...,样例格式为20200101增量表部分流水记录可能有更新 string sno 流水号,主键 string create time 创建日期样例格式为2020-10-10 00:10:30与sno唯一绑定

    1.1K20

    必要商城MySQL开发规范

    保留关键字; 临时库、临时表名必须以tmp为前缀并以日期为后缀; 备份库、备份表名必须以bak为前缀并以日期为后缀; 二、基本规范 使用INNODB存储引擎 5.5版本以后的默认引擘...且管理维护成本较高 拆分大字段和访问频率低的字段,分离冷热数据 用HASH进行散表,表名后缀使用十进制数,下标从0开始 首次分表尽量多的分,避免二次分表,二次分表的难度和成本较高 按日期时间分表需符合...对前10个字符进行索引能够节省大量索引空间,也可能会使查询更快 表必须有主键 不使用更新频繁地列作为主键 尽量不选择字符串列作为主键 不使用UUID、MD5、HASH作为主键...如tinyint有符号为-128-127,无符号为0-255 INT类型固定占用4个字节存储 使用TIMESTAMP存储时间 因为TIMESTAMP使用4字节,DATETIME使用8个字节...最擅长的是单表的主键/二级索引查询 Join消耗较多的内存,产生临时表 避免在数据库中进行数学运算 容易将业务逻辑和DB耦合在一起 MySQL不擅长数学运算和逻辑判断 无法使用索引

    68010
    领券