zoukankan      html  css  js  c++  java
  • 【mysql】知识点

    mysql执行原理

    只要是B/S架构,都是会有客户端与服务端,mysql也不例外。

    首先客户端发出一个请求,这个请求就是一个查询请求(Select),而它请求的对象就是服务端,服务端是怎么处理这项查询功能的呢?

    首先可以把服务端想象成一个大的容器,里面有四层结构,当一个请求过来后,将会执行这四层,执行一遍后才会返回给我们想要的结果。

    具体是:

    首先客户端发出一个Select操作--->连接层接收后给服务层--->服务层对你的查询进行一个优化,并把优化结果给引擎层--->选择当前数据库的引擎,选完引擎后,引擎将最终的数据交给了存储层--->存储层,用存储层来存数据

    # 查看Mysql所支持的所有引擎
    show ENGINES

    #查看当前数据库使用的引擎
    show variables like '%storage_engine%';

    参考:MySQL执行原理,逻辑分层、更改数据库处理引擎

    mysql如何让自增id归0

    • 当你不再需要该表时, drop
    • 当你仍要保留该表,但要删除所有记录时, truncate
    • 当你要删除部分记录时(always with a WHERE clause), delete.

    方法一: 如果曾经的数据都不需要的话,可以直接清空所有数据,并将自增字段恢复从1开始计数 

    truncate table 表名 

    方法二: 许多时候希望table中数据的id不要从1开始,像qq, id从10000开始
    代码如下:

    alter table 表名 AUTO_INCREMENT=10000;
    而且该语句也适用于修改现有表的id上, 比如大批量删除数据后,想id从654321退回123456开始

    alter table 表名 AUTO_INCREMENT=123456;

    但是经过实际测试, 单机的Mysql没有问题, Mysql Cluster下是无效的,可能在主键上的机制,还是有所不同。

    mysql数据表增加列

      因为Drop Table会把数据也删除掉,要增加数据列的时候,最好用Alter语句。如:

    alter table OrderSearchSummary add IsMonthly int(11) not NULL DEFAULT 0;

    alter table OrderSearchSummary add DistributorFirstName varchar(50);

    Update

    1、存在则更新,不存在则增加

      在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时则进行更新

    在刚碰到的时候,第一反应是将其实现分为两块,分别是判断增加,判断更新。

    后来发现在mysql中有  ON DUPLICATE KEY UPDATE一步就可以完成。

    该语句是基于唯一索引或主键使用,比如一个字段a被加上了unique index,并且表中已经存在了一条记录值为1:

    下面两个语句会有相同的效果:

    INSERT INTO table (a,b,c) VALUES (1,2,3)  
      ON DUPLICATE KEY UPDATE c=c+1;  
      
    UPDATE table SET c=c+1 WHERE a=1;

     ON DUPLICATE KEY UPDATE后面可以放多个字段,用英文逗号分割。

    INSERT INTO FerDB.RedisConfig(`RedisKey`, `RedisValue`, `RedisDesc`, `CreateDataTime`, `ExpiredMinutes`, `IsEncrypt`, `IsAdmin`, `EnableEdit`) 
    VALUES ('urn: MinTimeDiff', '120', '最低時間差(分鐘),默認120,參考範圍(30~600)', '2019-01-25 08:00:00', '14400', '0', '0', '1') 
    ON DUPLICATE KEY UPDATE RedisValue='120', RedisDesc='最低時間差(分鐘),默認120,參考範圍(30~600)', CreateDataTime='2019-01-25 08:00:00', 
    ExpiredMinutes='14400', IsEncrypt='0', IsAdmin='0', EnableEdit='1';

    2、互换表中两列数据方法

    创建表及记录用于测试

    CREATE TABLE `product` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '产品id',
     `name` varchar(50) NOT NULL COMMENT '产品名称',
     `original_price` decimal(5,2) unsigned NOT NULL COMMENT '原价',
     `price` decimal(5,2) unsigned NOT NULL COMMENT '现价',
     PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    INSERT INTO `product` (`id`, `name`, `original_price`, `price`) VALUES 
    (NULL, '雪糕', '5', '3.5'), 
    (NULL, '鲜花', '18', '15'), 
    (NULL, '甜点', '25', '12.5'), 
    (NULL, '玩具', '55', '45'), 
    (NULL, '钱包', '285', '195');
    View Code

    互换original_price与price的值

    错误方法:

    update product set original_price=price,price=original_price;

    这样执行的结果只会使original_price与price的值都是price的值,因为update有顺序的, 

    先执行original_price=price , original_price的值已经更新为price, 然后执行price=original_price,这里相当于没有更新。

    正确做法:

    update product as a, product as b set a.original_price=b.price, a.price=b.original_price where a.id=b.id;

    代码设置主键+自增长

    当db中的主键名称不是id或者ID时,eg:MID,则代码中的实体需要显示添加 主键属性。如下:

     [Key] //主键 
            [DatabaseGenerated(DatabaseGeneratedOption.Identity)]  //设置自增
            public int MID { get; set; }

    需要引入Microsoft.EntityFrameworkCore

  • 相关阅读:
    MongoDB的查询
    商品订购及货物采购信息系统(代码分析)
    Java连接数据库(mysql,sqlserver)
    开通博客第一天
    Ubuntu下java环境的搭建
    商品订购及货物采购信息系统(需求分析)
    GitHub客户端发布托管代码
    property中copy和strong修饰符的使用指北
    iOS界面间传值
    GPUImage的滤镜功能一览表
  • 原文地址:https://www.cnblogs.com/peterYong/p/10893899.html
Copyright © 2011-2022 走看看