数据库
数据库
1、MySQL连接不上
- 管理员进入 E:\Developments\MySql\bin
- mysqld.exe -install
- net start mysql
2、MySQL忘记密码,修改密码
mysql中忘记了root用户的密码?
- cmd -- > net stop mysql 停止mysql服务 * 需要管理员运行该cmd
- 使用无验证方式启动mysql服务: mysqld --skip-grant-tables
- 打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功
- use mysql;
- update user set password = password('你的新密码') where user = 'root';
- 关闭两个窗口
- 打开任务管理器,手动结束mysqld.exe 的进程
- 启动mysql服务
- 使用新密码登录
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失效
-
方法一:当前会话
重新连接之后可以正常查询,不过重启服务器的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;

浙公网安备 33010602011771号