Category: SQL

MySQL 常用命令

-- 查看数据库引擎的运行时信息
show engine innodb status\G;

-- 显示正在运行的线程
show processlist;

-- 杀死进程
kill id

-- 锁表处理
show status like ‘%lock%’
show OPEN TABLES where In_use > 0; 

-- 查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; 

-- 查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; 

-- 查看服务器状态
show status like ‘%lock%’;

-- 显示一个用户的权限
show grants for user_name; 

-- 显示一些系统特定资源的信息
show status; 

-- 显示系统变量的名称和值
show variables; 

-- 显示BDB存储引擎的日志
show logs; 

-- 显示最后一个执行的语句所产生的错误、警告和通知
show warnings; 

-- 只显示最后一个执行语句所产生的错误
show errors; 

-- 查看MySQL服务器运行的各种状态值
show global status;

-- 显示连接数
show variables like 'max_connections'; 
show global status like 'max_used_connections'; 

Install PostgreSql with brew

安装brew的文章请查看:https://jalena.bcsytv.com/archives/2298

版本选择

可以在 https://formulae.brew.sh/formula/postgresql#default 这里找到你需要的PostgreSql版本。本文章使用的是postgresql@10

安装及锁定版本

# 搜索需要的程序
brew search postgresql

# 安装程序
brew install postgresql@10 

# 锁定程序版本
brew pin postgresql@10

初始化设置

# 写入环境变量
echo 'export PATH="/usr/local/opt/postgresql@10/bin:$PATH"' >> ~/.bash_profile

# 让变量立即生效
source ~/.bash_profile

# 如果不想每次输入data目录路径,可以设置数据文件环境变量
echo 'export PGDATA="/usr/local/var/postgresql@10"' >> ~/.bash_profile

启动、使用

# 启动数据库
brew services start postgresql@10

# 停止数据库
brew services stop postgresql@10

# 重启数据库
brew services restart postgresql@10

# 查看当前运行的所有服务
brew services run --all

# 进入数据库
# 这种方式默认初始化的数据库账号为当前系统用户
# 默认的数据库为 postgres
psql postgres

设置快捷命令

vim ~/.bash_profile
alias pgst='brew services start postgresql@10'
alias pgsp='brew services stop postgresql@10'
alias pgrs='brew services restart postgresql@10'
source ~/.bash_profile

现在就可以在任何地方使用pgst来启动数据库了。

Mybatis 插入或更新数据

在日常的开发中,我们经常会遇到这样的需求,我们有一个存储主数据的表,当有新的数据写入的时候,若库中存在数据则更新,否则当作新的数据写入。

一般情况下,我们会先对数据库进行一次Select,若数据存在我们则执行更新操作,当然这种方法在大部分情况下是可行的,但数据量大或者数据写入频繁的时候,这种方法就表现出来它的不稳定。

其实在数据库中都提供了UNIQUE约束规则,我们可以在数据库中建立UNIQUE约束规则,这样我们在插入具有约束限制数据的时候,我们就会得到一个异常,我们可以捕获这个异常,在异常块中进行更新操作。

在Mysql中我们可以使用更加简单的方式,Mysql提供了这样一个方法on duplicate key update可以让数据库直接搞定数据的插入或更新。

首先在数据库中创建约束

create unique index mytest_uindex on table (fieldA, FieldB);

编写SQL语句

insert into table (fieldA, filedB)) values ('a', 'b') on duplicate key update filedA = a1, fieldB = a2;

这样一波操作下来,你会神奇的发现,原来可以如此简单。。

该方法会删除掉已有数据,再进行插入,具体可以观察数据的自增ID。

具体用法可以查看这里:https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

psql connect docker postgresql

方式一、

docker exec -u 0 -it <CONTAINER ID> bash
su postgres
psql -U <DBUSER> -W -d <DBNAME>

# 查看PGSQL默认服务
pstree

方式二、

docker run -it --rm --network docker_odoonetwork postgres psql -h pgsql -U odoo -d analogcircuit

docker-compose.yml

version: '2'
services:
  web:
    image: odoo:12.0
    container_name: odoo
    depends_on:
      - db
    ports:
      - "8069:8069"
    networks:
      - "odoonetwork"
    volumes:
      - odoo-web-data:/var/lib/odoo
      - ./config:/etc/odoo
      - ./addons:/mnt/extra-addons
  db:
    image: postgres:10
    container_name: pgsql
    networks:
      - "odoonetwork"
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_PASSWORD=odoo
      - POSTGRES_USER=odoo
      - PGDATA=/var/lib/postgresql/data/pgdata
    volumes:
      - odoo-db-data:/var/lib/postgresql/data/pgdata
networks:
  odoonetwork:
    driver: bridge  
volumes:
  odoo-web-data:
  odoo-db-data:

Oracle start with…connect by prior

Oracle中start with…connect by prior子句用法connect by 是结构化查询中用到的,其基本语法是

select column_name from tablename
start with 条件1
connect by 条件2
where 条件3;

简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段:org_id,parent_id,那么通过表示每一条记录的parent是谁,就可以形成一个树状结构,用上述语法的查询可以取得这棵树的所有记录。

prior 关键字表示父数据,prior 条件表示子数据需要满足父数据的什么条件。

实际使用

在项目中我们经常用到层级编码,例如:301090213,他其实是一个按照每2个数值分割的一种树形数据结构,在实际使用中我们希望通过301090213这个编码找出它所对应的所有父级数据。

常规情况我们会使用Like关键字来直接查找,这里其实Oracle提供了树形查找的方式。

我们其实可以这样写代码即可

SELECT * invname from
  bd_invcl
  start WITH pk_invcl = 'pk'
  connect by invcode = prior substr(invcode, 0, length(invcode) -2);

拼接字符

SELECT wm_concat(invname) from
   bd_invcl
   start WITH pk_invcl = 'pk'
   connect by invcode = prior substr(invcode, 0, length(invcode) -2);

SQL Between 边界问题

扩展知识

BETWEEN操作符是选取介于两个值之间的数据。这些值可以是数值、文本或者日期。

然而在使用between and限定日期的时候,特别需要注意,在and后的日期是到天的,那么默认为00:00:00。对于大于00:00:00这样的数据是会排除在外的。

这时候就需要将数据进行to_char处理。或者使用>= and <=这样的操作符进行处理。

Archives