十三、分组 分组就是把具有相同的数据值的行放在同一组中。 可以对同一分组数据使用汇总函数进行处理,例如求分组数据的平均值等。 指定的分组字段除了能按该字段进行分组,也会自动按该字段进行排序。...如果指定了 DELAY_KEY_WRITE 选项,在每次修改执行完成时,不会立即将修改的索引数据写入磁盘,而是会写到内存中的键缓冲区,只有在清理键缓冲区或者关闭表的时候才会将对应的索引块写入磁盘。...2 触发器的作用(触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。) SQL触发器是存储在数据库目录中的一组SQL语句。...每当与表相关联的事件发生时,即会执行或触发SQL触发器,例如插入,更新或删除。 QL触发器是一种特殊类型的存储过程。 这是特别的,因为它不像直接像存储过程那样调用。...尽量不做全表查询、减少表关联、优化查询字段等等) 9 数据库三范式(1NF:确保每一列的原子性 2NF:非键字段必须依赖于键字段 3NF:在1NF基础上,除了主键以外的其它列都不传递依赖于主键列,或者说
举个例子: 设想有一张 student 表,包括 id、name 和 age 三列,其中 id 是主键。现在要插入一条数据,若该数据的主键已存在,则更新该数据的姓名和年龄,否则插入该数据。...ON DUPLICATE KEY UPDATE语句,如果数据库中已存在具有相同唯一索引或主键的记录,则更新该记录。其底层原理和执行流程如下: 检查唯一索引或主键:执行INSERT INTO ......ON DUPLICATE KEY UPDATE语句时,数据库首先尝试插入新行。在此过程中,数据库会检查表中是否存在与新插入行具有相同的唯一索引或主键的记录。...冲突处理:如果不存在冲突的唯一索引或主键,新行将被正常插入。如果存在冲突,即发现重复的唯一索引或主键值,数据库将不会插入新行,而是转而执行更新操作。...浅谈主键跳跃 在 MySQL 中使用 INSERT ON DUPLICATE KEY UPDATE 语句时,如果插入操作失败(因为主键或唯一键冲突),而执行了更新操作,确实会导致自增主键计数器增加,即使没有实际插入新记录
“修改为“学好的话肯定是好找工作的”,则对应的timestamp类型的time字段的值会自动更新为当前最新时间。 3....约束的唯一目的其实就是为了保证数据库中数据的有效性,可预期性和完整性,一旦插入的数据不符合表约束,则MySQL直接拦截数据的插入,倒逼程序员向数据库中插入有效的数据。让数据库中的数据都是符合约束的。...当你不指定int后面的括号时,如果是有符号int,则括号内的数字默认是11位,如果是无符号int,则括号内的数字默认是10位。...如果stu和class表之间没有外键约束的话,则向stu表中插入数据时,有可能误操作将一个学生插入到两个班级,或者将学生插入到不存在的班级,以及删除班级,但班级此时还有学生,如果不添加约束,则学生又到了不存在的班级中了...其实这里的外键,个人觉得和复合主键有那么一点点相似,必须保证外键和引用之间的唯一性,但外键的约束显然是要比复合主键更严格的,比如删除引用(引用中还存在着外键)是不被允许的,一个外键列中的字段只能配一个引用列中的字段
在实际业务场景中,经常会有这样的需求:插入一条记录,如果数据表中已经存在该条记录则更新它的部分字段,比如更新update_time或者在某些列上执行累加操作等。...至此,前面描述的“数据表中已存在该条记录”的判断逻辑,在身份证记录表中的标准是指身份证号(identity_id字段的值)相同,因为我们认为用户在进行该操作时不会给某个身份证号指定分配主键(Id)值,所以以下讨论都不考虑主键...新插入的记录中除了指定的字段,其他字段都变成了默认值,即导致了数据字段丢失。因而如果要使用REPLACE,一定要保证sql语句中包含期望入库的所有字段。...,几乎不会有指定主键(id)的情形;另一方面,当指定主键(id)时,无论insert语句执行成功或失败,auto_increment值都不会递增,因而不会出现主从不一致的问题。...此外,参考博客中提到,MySQL在指定主键(id )进行插入的时候,如果这个id大于表的自增值,那么MySQL会把表的自增值修改为这个id值并加1,但是如果我们把主键更新成更大的值,MySQL并不会把表的自增值修改为更新后的值
如果没有传递 fields 参数,那么默认取所有字典的交集作为插入字段。这个也好理解,比如一个字典的键是a、b、c,一个是 b、c、d,那么就取 b、c 作为需要插入的字段。...peewee 不会为缺失的字段做默认处理。 2、当 rows 传递的是元组列表时,必须指定 fields,并且 fields 中字段名的顺序跟元组一致。...batch_size (int):每次批量插入的行数。如果未指定,则一次性全部插入。...Postgresql(支持该RETURNING子句),则先前未保存的模型实例将自动填充其新的主键值。...如果模型中一开始就用 PrimaryKeyField 或 primary_key 指定了主键,那么 save 执行的永远都是 update,所以什么主键不存在则 INSERT,存在则 UPDATE 这种操作根本不存在
基本用法:on dupdate key update 语句基本功能是:当表中没有原来记录时,就插入,有的话就更新。...1,on duplicate key update 语句根据主键id或唯一键来判断当前插入是否已存在。 2,记录已存在时,只会更新on duplicate key update之后指定的字段。...用法介绍 on dupdate key update 语句基本功能是:当表中没有原来记录时,就插入,有的话就更新。...结论: 4.如果传递了主键,是可以修改唯一键字段内容的。 这里要注意,如果这里的name修改为 caocao,huahua2 会报唯一键冲突的。可以自行尝试。...,则name会保持数据库中的值,不会更新。
只有在包含ROWVERSION字段的表中进行插入和更新时,此计数器才会递增。 ROWVERSION值是唯一的且不可修改。此名称空间范围的计数器永远不会重置。...即使删除名称空间中包含ROWVERSION字段的所有表,也不会重置此计数器。RowVersion字段不应包含在唯一键或主键中。 RowVersion字段不能是IDKey索引的一部分。...由于以前未使用过计数器,因此它们是1到10。在Table2中插入十行。由于Table2没有ROWVERSION字段,因此计数器不会增加。更新表1的行。...但是,用户可以指定非零整数值插入期间针对此字段的值,将覆盖表计数器的默认值。如果INSERT没有为计数器字段指定非零整数值,则计数器字段将自动接收正整数计数器值。计数从1开始。...但是,用户可以为此指定非零整数值插入过程中的字段,将覆盖表计数器的默认值。如果INSERT没有为计数器字段指定非零整数值,则计数器字段将自动接收正整数计数器值。计数从1开始。
### 联合表继承的按主键批量更新 当使用具有联合表继承的映射时,ORM 批量更新的行为与使用映射进行批量插入时类似;如 联合表继承的批量插入 中所述,批量更新操作将为映射中表示的每个表发出一条 UPDATE...如果这两个名称恰好不同,则键应与ORM 映射属性名称匹配,而不是实际的数据库列名称。...当以这种方式使用 Insert 构造时,如果没有将参数字典列表传递给 Session.execute.params 参数,将不会使用批量 ORM 插入模式,而是将 INSERT 语句按原样呈现并精确调用一次...禁用多参数集 UPDATE 语句的按主键批量 ORM 更新 当满足以下条件时,自动使用 ORM 按主键批量更新功能: 给定的 UPDATE 语句针对的是 ORM 实体。...这种使用方式与之前描述的 ORM 按主键批量更新中的功能不同,ORM 使用给定的 WHERE 子句如所示,而不是将 WHERE 子句修复为按主键。
自然主键(推荐使用,主键尽量不要和业务数据挂钩) 业务主键(比如用学号做主键,一单业务有变化,主键相关表可能就会有问题) 外键约束:foreign key 一张表中的某个字段在另外一张表中被标记为外键约束...被标记字段的表称为子表,另外一张表叫父表 删除数据,先删除子表,再删除父表 插入数据,先插入父表,再插入子表 语法格式: ```sql foreign key(列名) references 父表表名(父表中要被添加的列名...); ``` 外键(父表中的列)不一定要是主键,但至少具有 unique 约束;外键可以为Null ....(如果没有数据库,则利用前面的创建数据库语句进行创建) use 数据库名字; 这两步是必须的,我们的表都是在库的基础上才有的,所以在创建表之前我们需要选对要使用的数据库。...创建表设置了默认值的列除外) 插入日期 mySQL的日期格式: %Y年 %m 月 %d 日 %h 时 %m 分 %s 秒 str_to_date('日期字符串','日期格式') 比如数据表中员工的入职日期字段
外键约束:用来和其他表建立联系的字段,是另一表的主键,可以重复可以为空,可以有多个外键。非空约束:不能为空。默认值约束:不指定值时使用默认值填充。...查询缓存,有则返回,mysql 8.0版本后移除,因为有更新或条件不同则缓存失效作用不大。分析器,进行sql语法分析。优化器,选择最优方案,生成执行计划。执行器,根据执行计划,调用存储引擎接口执行。...索引分裂插入数据时,如果不是插入到叶子节点的最后,而是插入到中间,则可能导致索引的页的分裂,导致磁盘数据移动。使用自增ID作为主键可以减少索引分裂的发生。...格式:Statement:记录写数据的原始 sql,当有函数时可能出现不一致。Row:记录修改的数据,日志量较大。Mixed:混合模式,根据执行的 SQL 语句选择日志记录方式。...分区表限制无法使用外键约束。分区数量有限,5.6.7 之后 最多8192 个分区。分区键必须是主键或唯一索引的部分或全部字段。分区类型RANGE:按范围分区。LIST:按离散值分区。
约束类型: 默认约束:插入时如果没有指定值,则插入默认值 主键约束:保证数据的唯一性 外键约束:预防破坏表之间连接的行为 非空约束 :字段值不能为空 唯一性约束:字段值不能重复 自增约束:字段在插入时自动...外键(FOREIGN KEY)和连接(JOIN)将多张表关联。 设计外键 有两张表A、B通过id进行关联,如果Id在A中时主键,那么A便称为主表,B表就是从表,B表中的id字段就是外键。...从表中定义定义的外键指定外键字段、对应主表中的字段,MySQL会根据外键约束的定义,监控主表中数据的删除操作,如果发现要删除的主表记录,正在被从表中某条记录的外键字段所引用,MySQL会提示错误,从而保证关联数据不会丢失...SQL语句中的错误,所以如果事务中的某SQL执行出现错误后提交会出现事务不一致的问题,如mytrans在插入时出现错误,inventory表执行成功,库存字段数据-5,这样会导致数据不一致的问题。...rollback回滚:在一个事务中,如果有一个SQL语句执行失败,那么当前事务便不会提交,相当于当前事务中的SQL并没有执行。
,D表示小数点后面的长度,M和D又称为精度和标度,如float(7,4)的 可显示为-999.9999,MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001。...FLOAT和DOUBLE在不指 定精度时,默认会按照实际的精度来显示,而DECIMAL在不指定精度时,默认整数为10,小数为0。 5 超键、候选键、主键、外键分别是什么?...外键 外键是相对于主键的,比如在学生记录里,主键为学号,在成绩单表中也有学号字段,因此学号为成绩单表的外键,为学生表的主键。所以,主键为候选键的子集,候选键为超键的子集,而外键的确定是相对于主键的。...第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。...可能会存在的问题:(1)数据冗余:每条记录都含有相同的信息,比如所有学生都选了同一门课程。(2)删除异常:删除学生,则对应的课程也被删除了。(3)插入异常:学生未选课,则无法插入数据库。
如果INSERT请求由于唯一键冲突而失败(对于某个唯一键的字段,存在与为INSERT指定的行具有相同值的行),则它会自动转换为该行的UPDATE请求,并且INSERT或UPDATE使用指定的字段值更新现有行...%NOJOURN-在插入操作期间禁止日志记录。任何行中所做的任何更改都不会被记录下来,包括拉出的任何触发器。如果在使用%NOJOURN的语句之后执行ROLLBACK,则不会回滚该语句所做的更改。...%NOLOCK-插入时该行未锁定。这应该仅在单个用户/进程更新数据库时使用。用户必须具有当前命名空间的相应%NOLOCK管理权限才能应用此限制。...如果指定列列表,则各个值必须在位置上与列列表中的列名相对应。 值赋值语法 插入记录时,可以通过多种方式为指定列赋值。默认情况下,所有未指定的列必须接受NULL或具有定义的默认值。...如果定义了其中一个字段,则如果没有为这些字段指定值,此INSERT语法将发出SQLCODE-62错误;如果确实为这些字段指定值,此INSERT语法将发出SQLCODE-138无法插入/更新只读字段的值错误
)」,如果没有指定的话 InnoDB 会自己生成一个隐藏列Row_id来充当默认主键,「MyISAM 可以没有」 ---- 3.为什么推荐使用自增 id 作为主键?...不用刻意维护 ---- 3.页分裂容易维护,当插入数据的当前页快满时,会发生页分裂的现象,如果主键索引不为自增 id,那么数据就可能从页的中间插入,页的数据会频繁的变动,「导致页分裂维护成本较高」...,在 where 条件中出现的字段,「如果只有组合索引中的部分列,则这部分列的触发索引顺序」,是按照定义索引的时候的顺序从前到后触发,最左面一个列触发不了,之后的所有列索引都无法触发。...查询 当普通索引为条件时查询到数据会一直扫描,直到扫完整张表 当唯一索引为查询条件时,查到该数据会直接返回,不会继续扫表 ---- 更新 普通索引会直接将操作更新到 change buffer 中...「可串行化」:最高事务隔离级别,不管多少事务,都是「依次按序一个一个执行」 「脏读」 脏读指的是·「读到了其他事务未提交的数据」,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,
,如果为null,则没有使用索引 MySQL认为必须要执行查询的行数,在innodb引擎的表中,是一个估计值,可能并不总是准确的 explain执行计划各字段含义: 六、索引使用 验证索引效率 在未建立索引之前...or连接的条件 用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有 索引,那么涉及的索引都不会被用到 数据分布影响 如果MySQL评估使用索引比全表更慢,则不使用索引 SQL提示 SQL...主键设计原则 满足业务需求的情况下,尽量降低主键的长度 插入数据时,尽量选择顺序插入,选择使用AUTO_INCREMENT自增主键 尽量不要使用UUID做主键或者是其他自然主键,如身份证号 业务操作时,...服务层对于返回的每一行,放一个数字“1”进去,直接按行进行累加 count(*) InnoDB引擎并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加 七、update优化 InnoDB...; ==注意:在命令行中,执行创建存储过程的SQL时,需要通过关键字delimiter指定SQL语句的结束。
如果字段的值是NULL (ISNULL(字段) 返回真),则 IF 函数返回0。 如果字段的值不是NULL,IF 函数返回1。...、更新时主键、唯一键重复 在MySQL中插入、更新数据有时会遇到主键重复的场景,通常的做法就是先进行删除在插入达到可重复执行的效果,但是这种方法有时候会错误删除数据。...插入数据时我们可以使用IGNORE,它的作用是插入的值遇到主键或者唯一键重复时自动忽略重复的数据,不影响后面数据的插入,即有则忽略,无则插入。...movie_name, actors, price, release_date) VALUES (14, '神话2', '成龙', 114, '2005-12-22'); 还可以使用REPLACE关键字,当插入的记录遇到主键或者唯一键重复时先删除表中重复的记录行再插入...它的作用就是当插入的记录遇到主键或者唯一键重复时,会执行后面定义的UPDATE操作。相当于先执行Insert 操作,再根据主键或者唯一键执行update操作,即有就更新,没有就插入。
多行数据指定列插入: 多行数据全列插入: 3.插入是否更新 由于 主键 或者 唯一键 对应的值已经存在而导致插入失败。...若插入的数据发生主键或者唯一键冲突,就会插入失败,但是我们仍然希望将主键和唯一键之外的的值进行特定的修改,这就用到了 on duplicate key ,即不存在则插入,存在则修改: insert into...-- 主键 或者 唯一键 没有冲突,则直接插入; -- 主键 或者 唯一键 如果冲突,则删除后再插入 REPLACE INTO students (sn, name) VALUES (20001, '曹阿瞒...update exam_result set chinese = 2*chinese; 注意:更新全表的语句慎用 四.删除数据Delete 删除数据是以行为单位的删除,如果删除时不用where子句筛选特定行数据...五.去重表数据 案例:删除表中的的重复复记录,重复的数据只能有一份 distinct只是在select显示时的去重,不会影响原表中的数据。而现在要的是将表中数据的去重。
使用外键,检查插入、更新和删除以确保它们不会导致相关表之间的不一致。...如果该行被更新,撤消日志记录包含在更新前重建该行内容所需的信息。 一个 6 字节的DB_ROW_ID字段包含一个行 ID,随着插入新行而单调增加。...如果 InnoDB自动生成聚集索引,则该索引包含行 ID 值。否则,该 DB_ROW_ID列不会出现在任何索引中。 回滚段中的撤消日志分为插入和更新撤消日志。...当新记录插入到InnoDB 聚集索引中时,InnoDB尝试保留 1/16 的页空闲空间以供将来插入和更新索引记录。如果按顺序(升序或降序)插入索引记录,则生成的索引页大约为 15/16。...注意的是,当count()语句包含where条件时MyISAM也需要扫描整个表 对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引 清空整个表时
3.1.6、外键 用来关联两个实体(数据表)之间一个关系的字段,拥有外键字段的表又叫做主表,使用外键字段作为主键的表则称为从表,现在一般推荐使用逻辑外键而不使用物理外键。... 视图是基于SQL语句结果集的一个虚拟的表,它的数据还是依赖于SQL语句的基本表,如果数据有变动,则视图查询回来的数据也会变动。...; Delete关键字 Delete关键字主要用于数据表数据的删除操作,它只是删除表中的数据,并不会对表的结构和索引造成影响(注意:生产环境慎用该语句,如果要使用该语句时一定要检查仔细是否需要带where...关键字主要用于对表数据的一个更新操作,不会对表结构和索引造成影响(注意:使用时一定要检查是否需要携带where条件,如果不携带,则更新的是表中所有的记录的数据) 一、更新某些记录字段的值(需要结合...count()和count(1)一样,返回符合条件的记录总条数,count(字段名)则是返回符合条件中字段名所在的列中非NULL值的记录总条数(即如果字段名对应列的值为NULL,则不会被记到总数中)。
领取专属 10元无门槛券
手把手带您无忧上云