Loading

数据库

数据库

1、MySQL连接不上

  1. 管理员进入 E:\Developments\MySql\bin
  2. mysqld.exe -install
  3. net start mysql

2、MySQL忘记密码,修改密码

  mysql中忘记了root用户的密码?

  1. cmd -- > net stop mysql 停止mysql服务 * 需要管理员运行该cmd
  2. 使用无验证方式启动mysql服务: mysqld --skip-grant-tables
  3. 打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功
  4. use mysql;
  5. update user set password = password('你的新密码') where user = 'root';
  6. 关闭两个窗口
  7. 打开任务管理器,手动结束mysqld.exe 的进程
  8. 启动mysql服务
  9. 使用新密码登录

3.数据库连接

#mysql5驱动不同com.mysql.jdbc.Driver
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: root

#mysql8驱动不同com.mysql.cj.jdbc.Driver、需要增加时区的配置 serverTimezone=GMT%2B8
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: root

4、docker安装mysql

docker pull mysql:5.6

# 启动
docker run -d -p 3306:3306 -v /docker/mysql/conf:/etc/mysql/conf.d -v /docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=kjcyy0127. --name mysql mysql:5.6

# 进入容器
docker exec -it mysql bash

# 在/docker/mysql/conf 添加配置文件
my.cnf

在 my.cnf文件下新增 skip-grant-tables (没有登录权限时使用,跳过密码)
头部有[mysqld]

# 修改MySQL数据库配置文件无密码登录后,修改密码报错:
# ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
# 先执行 
flush privileges;
# 重新设置登录密码
mysql> set password for ‘root’@‘localhost’=password(‘kjcyy0127.’);
# 或者
set password for root@localhost=password('你的密码');

# 设置远程访问
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'kjcyy0127.' WITH GRANT OPTION;

# 刷新
mysql> flush privileges;

# 远程连接
mysql -h 47xxxx -p 3306 -uroot -p

  

5、GROUP_CONCAT

SELECT GROUP_CONCAT("'",id,"'") FROM `works_register` where subject_name NOT IN('语文','数学','英语','综合')

  加上前缀和后缀

  

6、数据库时间字段、不要开启自动更新

  • 在数据库连接时,加上时区信息

    jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
    
  • 在实体类字段上添加时区信息

    @ApiModelProperty(value = "创建时间(上传文件)")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    private Date createTime;
    
  • 数据库不要开启,自动更新

7、binlog数据恢复

  https://www.cnblogs.com/michael9/p/11923483.html

 /usr/local/mysql/bin/mysqlbinlog --no-defaults --base64-output=decode-rows -v \
 --stop-datetime  "2022-05-20 21:00:00" \
 --database sy_en_resource \
 /data/3306/data/mysql-bin.000009 | mysql -uroot -pmintmath -f

8、mysql 8版本需要修改SQLmode避免 groupby失效

https://blog.csdn.net/orient_/article/details/120881005

  • 方法一:当前会话

    重新连接之后可以正常查询,不过重启服务器的mysql的话,系统配置会还原。

    set @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
    
  • 方法二:修改配置文件

    直接更改mysql的配置文件,重启

    一般是Linux服务器,就在配置文件(my.cnf)中修改 sql_mode 的配置(在/usr/local/etc/my.cnf路径下);

    如果是Windows,就修改配置文件my.ini里对应的sql_mode 。

  • 方法三:使用函数

    any_value()​ ​函数,这个就是用来解决only_full_group_by 问题的。即,将多出来的字段使用这个函数就好了。

9、条件加在 jion 后和where后

  • join后是对要连接的表进项筛选

  • where是对整体结果进行筛选

10、MySQL锁表

< 查看数据库当前正在执行的进程,只是显示部分

show processlist;

  • 显示所有的正在进行的进程

    show full processlist;

  • 当前运行的所有事务

    SELECT * FROM information_schema.INNODB_TRX;

  • 当前出现的锁

    SELECT * FROM information_schema.INNODB_LOCKs;

  • 锁等待的对应关系

    SELECT * FROM information_schema.INNODB_LOCK_waits;

  解释:看事务表INNODB_TRX,里面是否有正在锁定的事务线程,
看看ID是否在show processlist里面的sleep线程中,
如果是,就证明这个sleep的线程事务一直没有commit或者rollback而是卡住了。
trx_mysql_thread_id​ 即为事务线程id。
我们需要使用kill id 命令将其杀死

11、mybatis 批量插入、更新

我们使用了 ON DUPLICATE KEY UPDATE​ 子句来实现插入冲突时的更新操作。这样,对于已存在的记录,将执行更新操作;对于不存在的记录,将执行插入操作。

  mapper层:

public interface YourMapper {
    void batchInsertAndUpdate(List<YourObject> list);
}

  xml层:

mysql

ON DUPLICATE KEY UPDATE

column1 = VALUES(column1)

是指当出现冲突时,以这个字段的value进行覆盖,所以是对应的数据库的字段。

<insert id="batchInsertAndUpdate" parameterType="java.util.List">
  INSERT INTO your_table (column1, column2, column3)
  VALUES 
  <foreach collection="list" item="item" separator=",">
    (#{item.property1}, #{item.property2}, #{item.property3})
  </foreach>
  ON DUPLICATE KEY UPDATE
  column1 = VALUES(column1),
  column2 = VALUES(column2),
  column3 = VALUES(column3)
</insert>

postgresql ​

是指当出现冲突时,以这个字段的value进行覆盖,所以是对应的数据库的字段。

注意 EXCLUDED 后面的字段是和数据库字段对应的

ON CONFLICT (column1) DO UPDATE

SET

EXCLUDED.column2,

<insert id="batchInsertAndUpdate" parameterType="java.util.List">
        INSERT INTO monthly.hr_info (name, phone,subcompany,job_info,hr_no,identity_card,email,sex,age,education,
        degree,work_time,job_level,unicom_time,technical_title,strategic_talent,allowance,comment,create_time,update_time)
        VALUES
        <foreach collection="list" item="item" separator=",">
            (#{item.name}, #{item.phone}, #{item.subcompany}, #{item.jobInfo}, #{item.hrNo},
            #{item.identityCard}, #{item.email}, #{item.sex}, #{item.age}, #{item.education},
            #{item.degree}, #{item.workTime}, #{item.jobLevel}, #{item.unicomTime}, #{item.technicalTitle},
            #{item.strategicTalent}, #{item.allowance}, #{item.comment},CURRENT_TIMESTAMP,CURRENT_TIMESTAMP)
        </foreach>
        ON CONFLICT (name,phone) DO UPDATE
        SET
        name = EXCLUDED.name,
        phone = EXCLUDED.phone,
        subcompany = EXCLUDED.subcompany,
        job_info = EXCLUDED.jobInfo,
        hr_no = EXCLUDED.hrNo,
        identity_card = EXCLUDED.identityCard,
        email = EXCLUDED.email,
        sex = EXCLUDED.sex,
        age = EXCLUDED.age,
        education = EXCLUDED.education,
        degree = EXCLUDED.degree,
        work_time = EXCLUDED.workTime,
        job_level = EXCLUDED.jobLevel,
        unicom_time = EXCLUDED.unicomTime,
        technical_title = EXCLUDED.technicalTitle,
        strategic_talent = EXCLUDED.strategicTalent,
        allowance = EXCLUDED.allowance,
        comment = EXCLUDED.comment,
        update_time = CURRENT_TIMESTAMP
    </insert>

12、postgresql

  • 设置主键自增序列

    CREATE SEQUENCE monthly.hr_info_id_seq
    	INCREMENT BY 1
    	MINVALUE 1
    	MAXVALUE 9223372036854775807
    	START 1;
    
  • 使用主键自增

    nextval 设置自增

    CONSTRAINT 指定主键别名

    CREATE TABLE "monthly"."hr_info" (
      "id" int8 NOT NULL DEFAULT nextval('"monthly".hr_info_id_seq'::regclass),
      "name" varchar(50) COLLATE "pg_catalog"."default" NOT NULL,
      "job_level" int2,
      "unicom_time" date,
      "create_time" timestamp(6),
      "update_time" timestamp(6),
      CONSTRAINT "hr_info_pkey" PRIMARY KEY ("id")
    )
    ;
    
  • 设置ID重置为1

    ALTER SEQUENCE your_table_id_seq RESTART WITH 1;
    
posted @ 2023-08-10 08:54  我的派大星呢  阅读(24)  评论(0)    收藏  举报