mysql 按日期拆分成多条记录_六天带你玩转MySQL-第3天

回顾

字段类型(列类型): 数值型, 时间日期型和字符串类型

数值型: 整型和小数型(浮点型和定点型)

时间日期型: datetime, date,time,timestamp, year

字符串类型: 定长, 变长, 文件字符串(text 和 blob), 枚举和集合

Mysql 记录长度: 65535 个字节, varchar 达不到理论长度, NULL 占用一个字节, text 文本不占用记录长度(但是本身占据十个字节)

字段属性: 空属性, 列描述, 默认值

字段属性

主键, 唯一键和自增长.

主键

主键: primary key,主要的键. 一张表只能有一个字段可以使用对应的键, 用来唯一的约束该字段里面的数据, 不能重复: 这种称之为主键.

一张表只能有最多一个主键.

增加主键

SQL 操作中有多种方式可以给表增加主键: 大体分为三种.

方案 1: 在创建表的时候,直接在字段之后,跟 primary key 关键字(主键本身不允许为空)

5d720df1db82bbd9bb6faf51ef076efd.png

优点: 非常直接; 缺点: 只能使用一个字段作为主键

方案 2: 在创建表的时候, 在所有的字段之后, 使用 primary key(主键字段列表)来创建主键

(如果有多个字段作为主键,可以是复合主键)

39bd7c182cc457d3d34f5788122de668.png

方案 3: 当表已经创建好之后, 额外追加主键: 可以通过修改表字段属性, 也可以直接追加.

Alter table 表名 add primary key(字段列表);

bf10d2168636de1eec87dc87ead08f60.png

前提: 表中字段对应的数据本身是独立的(不重复)

主键约束

主键对应的字段中的数据不允许重复: 一旦重复,数据操作失败(增和改)

95e14c555e4f76a67626ae8309237e26.png

更新主键 & 删除主键

没有办法更新主键: 主键必须先删除,才能增加.

Alter table 表名 drop primary key;

f0c8c05a60bed910a0ed61b0bdc20469.png

主键分类

在实际创建表的过程中, 很少使用真实业务数据作为主键字段(业务主键,如学号,课程号);

大部分的时候是使用逻辑性的字段(字段没有业务含义,值是什么都没有关系), 将这种字段

主键称之为逻辑主键.

Create table my_student(Id int primary key auto_increment comment '逻辑主键: 自增长', -- 逻辑主键Number char(10) not null comment '学号',Name varchar(10) not null)

自动增长

自增长: 当对应的字段,不给值,或者说给默认值,或者给NULL的时候, 会自动的被系统触发,

系统会从当前字段中已有的最大值再进行+1 操作,得到一个新的在不同的字段.

自增长通常是跟主键搭配.

新增自增长

自增长特点: auto_increment

1. 任何一个字段要做自增长必须前提是本身是一个索引(key 一栏有值)

81e04ead722731723aed24ce4a3da369.png

2. 自增长字段必须是数字(整型)

135d640a02638c11b91b6d099614c603.png

3. 一张表最多只能有一个自增长

b1ec0db1f17b5e3939678244d7de321f.png

自增长使用

当自增长被给定的值为 NULL 或者默认值的时候会触发自动增长.

f194c33eb20e719e299b22f0736f427d.png

自增长如果对应的字段输入了值,那么自增长失效: 但是下一次还是能够正确的自增长(从最

大值+1)

383d8ca62fcfbbc7aaf9ccc313234727.png

如何确定下一次是什么自增长呢? 可以通过查看表创建语句看到.

a790f5c6ba218e954f332d23ac86c855.png

修改自增长

自增长如果是涉及到字段改变: 必须先删除自增长,后增加(一张表只能有一个自增长)

修改当前自增长已经存在的值: 修改只能比当前已有的自增长的最大值大,不能小(小不生效)

Alter table 表名 auto_increment = 值;

31c376aafa2dc17196999d416b9437d7.png

向上修改可以

53c367c6b8f19dc9c7b3cc253a23a08d.png

思考: 为什么自增长是从 1 开始?为什么每次都是自增 1 呢?

所有系统的变现(如字符集,校对集)都是由系统内部的变量进行控制的.

查看自增长对应的变量: show variables like 'auto_increment%';

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用MySQL日期函数和一些技巧来将一条记录日期拆分多条记录。以下是一种方法: 假设你有一个`my_table`,其中包含日期和数量两个列,你想按日期将每个数量值拆分单独的记录。 首先,你可以使用`DATE_FORMAT`函数将日期列格式化为只包含年月日的字符串,并使用`CAST`函数将数量列转换为整数类型。然后,你可以使用`GENERATE_SERIES`函数生一个日期序列,该序列包含在查询中指定的日期范围内的所有日期。最后,你可以将生日期序列与原始连接,并使用`VALUES`子句将每个日期和数量组合单独的记录。 下面是一条可以实现此功能的SQL查询: ``` SELECT DATE_FORMAT(dates.date, '%Y-%m-%d') AS date, CAST(my_table.quantity AS INT) AS quantity FROM ( SELECT DATE_ADD('2022-01-01', INTERVAL seq.seq DAY) AS date FROM ( SELECT (t4.n * 1 + t3.n * 10 + t2.n * 100 + t1.n * 1000) AS seq FROM (SELECT 0 AS n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS t1 CROSS JOIN (SELECT 0 AS n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS t2 CROSS JOIN (SELECT 0 AS n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS t3 CROSS JOIN (SELECT 0 AS n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS t4 ) AS seq WHERE seq.seq BETWEEN 0 AND DATEDIFF('2022-01-31', '2022-01-01') ) AS dates INNER JOIN my_table ON DATE_FORMAT(my_table.date, '%Y-%m-%d') = dates.date ORDER BY dates.date; ``` 该查询将`my_table`中的所有日期拆分一个序列,并使用`INNER JOIN`连接每个日期值与原始中的记录。然后,它将每个日期值和相应的数量值组合单独的记录。 需要注意的是,该查询中的日期范围和格式化字符串应该与你的实际情况相匹配。此外,`GENERATE_SERIES`函数在MySQL中并不存在,我们使用了一些技巧来实现这个函数的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值