MySQL报错:sql_mode=only_full_group_by 4种解决方法含举例

首先,打开数据库,输入

select @@global.sql_mode;

这个时候,就会返回得到以下的信息:(不同电脑返回的信息可能不同)

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

如果里面包含 ONLY_FULL_GROUP_BY,那么就重新设置,在数据库中输入以下代码,去掉ONLY_FULL_GROUP_BY即可:

SET GLOBALsql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';

 

MySQL根据某一个或者多个字段查找重复数据的sql语句

MySql 删除多个字段重复的数据(只保留一条)

 DELETE FROM 表名 WHERE (字段1,字段2,字段3)
IN 
(SELECT 字段1,字段2,字段3 FROM (SELECT 字段1,字段2,字段3 FROM 表名 GROUP BY 字段1,字段2,字段3 HAVING COUNT(*)>1) s1) 
AND
id NOT IN (SELECT id FROM (SELECT id FROM 表名 GROUP BY 字段1,字段2,字段3 HAVING COUNT(*)>1) s2);

sql 查出一张表中重复的所有记录数据

1.表中有id和name 两个字段,查询出name重复的所有数据

select * from xi a where (a.username) in (select username from xi group by username having count(*) > 1)

 

2、查询出所有数据进行分组之后,和重复数据的重复次数的查询数据,先列下:

1
select count(username) as '重复次数',username from xi group by username having count(*)>1 order by username desc

3、一下为 查看别人的 结果,现列下:查询及删除重复记录的方法大全

1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断

1
2
select * from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)

2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录

1
2
3
delete from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)

3、查找表中多余的重复记录(多个字段)

1
2
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录

1
2
3
delete from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录

1
2
3
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

(二)

比方说

在A表中存在一个字段“name”,

而且不同记录之间的“name”值有可能会相同,

现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;

1
Select Name,Count(*) From A Group By Name Having Count(*) > 1

如果还查性别也相同大则如下:

1
Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1

(三)

方法一

1
2
3
4
5
6
7
8
9
10
11
declare @max integer,@id integer
declare cur_rows cursor local for
select 主字段,count(*) from 表名 group by 主字段 having count(*) >;
open cur_rows fetch cur_rows into @id,@maxwhile @@fetch_status=0
begin
 select @max = @max -1
 set rowcount @max
 delete from 表名 where 主字段 = @id
fetch cur_rows into @id,@maxend
close cur_rows
set rowcount 0

方法二"重复记录"有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

1、对于第一种重复,比较容易解决,使用

1
select distinct * from tableName

就可以得到无重复记录的结果集。

如果该表需要删除重复的记录(重复记录保留1条),

可以按以下方法删除

1
2
3
4
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp

发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集

1
2
3
select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
select * from #Tmp where autoID in(select autoID from #tmp2) 

最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)

(四)查询重复

1
select * from tablename where id in (select id from tablenamegroup by idhaving count(id) > 1)

对一个字段查找重复记录

根据sample_code字段找到重复记录

1
SELECT * FROM tb_table WHERE sample_code IN( SELECT sample_code FROM tb_table GROUP BY sample_code HAVING COUNT(sample_code) > 1 );

对多个字段查找重复记录(这里以2个为例)

根据name和code字段找到重复记录

1
2
3
4
SELECT * from (SELECT *, CONCAT(name,code) as nameAndCode from tb_table) t WHERE t.nameAndCode in
(
 SELECT nameAndCode from (SELECT CONCAT(name,code) as nameAndCode from tb_table) tt GROUP BY nameAndCode HAVING count(nameAndCode) > 1
)

总结

以上所述是小编给大家介绍的MySQL根据某一个或者多个字段查找重复数据的sql语句,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

Python数据库连接池DBUtils(以pymysql模块为例连接数据库)

pip3 install DBUtils

DBUtils是Python的一个用于实现数据库连接池的模块。

此连接池有两种连接模式:

# BDUtils数据库链接池:
模式一:基于threaing.local实现为每一个线程创建一个连接,关闭是伪关闭,当前线程可以重复
模式二:连接池原理
    如果有三个线程来数据库中获取连接:
        如果三个同时来的,一人给一个连接;
        如果一个一个来,有时间间隔,用一个连接就可以为三个线程提供服务;
        其他情况:
            有可能:1个连接就可以为三个线程提供服务
            有可能:2个连接就可以为三个线程提供服务
            有可能:3个连接就可以为三个线程提供服务
    PS:maxshared在使用pymysql中均无用。链接数据库的模块:只有threadsafety>1的时候才有用。

模式一:为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放到连接池,供自己线程再次使用。当线程终止时,连接自动关闭。(如果线程比较多还是会创建很多连接,推荐使用模式二)

import pymysql
from DBUtils.PersistentDB import PersistentDB
 
POOL = PersistentDB(
    creator=pymysql,  # 使用链接数据库的模块
    maxusage=None,    # 一个链接最多被重复使用的次数,None表示无限制
    setsession=[],    # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
    ping=0,
    # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
    closeable=False,
    # 如果为False时,conn.close() 实际上被忽略,供下次使用,再线程关闭时,才会自动关闭链接。如果为True时, conn.close()则关闭链接,那么再次调用pool.connection时就会报错,因为已经真的关闭了连接(pool.steady_connection()可以获取一个新的链接)
    threadlocal=None, # 本线程独享值得对象,用于保存链接对象,如果链接对象被重置
    host="127.0.0.1",
    port=3306,
    user="root",
    password="",
    database="code_record",
    charset="utf8"
)
 
def func():
    conn = POOL.connection(shareable=False)
    cursor = conn.cursor()
    cursor.execute("select * from userinfo")
    ret = cursor.fetchall()
    print(ret)
    cursor.close()
    conn.close()
 
func()

模式二:创建一批连接到连接池,供所有线程共享使用,使用完毕后再放回到连接池。(由于pymysql、MySQLdb等threadsafety值为1,所以该模式连接池中的线程会被所有线程共享。)

import pymysql
from DBUtils.PooledDB import PooledDB
POOL = PooledDB(
    creator=pymysql,   # 使用链接数据库的模块
    maxconnections=6,  # 连接池允许的最大连接数,0和None表示不限制连接数
    mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
    maxcached=5,  # 链接池中最多闲置的链接,0和None不限制
    maxshared=3,
    # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
    blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
    maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制
    setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
    ping=0,
    # ping MySQL服务端,检查是否服务可用,如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
    host="127.0.0.1",
    port=3306,
    user="root",
    password="",
    database="code_record",
)
 
def func():
    # 检测当前正在运行连接数的是否小于最大链接数,如果不小于则:等待或报raise TooManyConnections异常
    # 否则
    # 则优先去初始化时创建的链接中获取链接 SteadyDBConnection。
    # 然后将SteadyDBConnection对象封装到PooledDedicatedDBConnection中并返回。
    # 如果最开始创建的链接没有链接,则去创建一个SteadyDBConnection对象,再封装到PooledDedicatedDBConnection中并返回。
    # 一旦关闭链接后,连接就返回到连接池让后续线程继续使用。
    conn = POOL.connection()
    cursor = conn.cursor()
    cursor.execute('select * from userinfo')
    result = cursor.fetchall()
    print(result)
    conn.close()
 
func()

为什么要使用数据库连接池呢?

如果没有连接池,使用pymysql来连接数据库时,单线程应用完全没有问题;但如果涉及到多线程应用那么就需要加锁,一旦加锁那么连接势必就会排队等待(无法并发),当请求比较多时,性能就会降低了。

加锁

import pymysql
import threading
from threading import RLock
 
LOCK = RLock()
CONN = pymysql.connect(host='127.0.0.1',
                       port=3306,
                       user='root',
                       password='',
                       database='code_record',
                       charset='utf8')
 
def task(arg):
    with LOCK:
        cursor = CONN.cursor()
        cursor.execute('select * from userinfo')
        ret = cursor.fetchall()
        cursor.close()
        print(ret)
 
for i in range(10):
    t = threading.Thread(target=task, args=(i,))
    t.start()

不加锁(报错)

import pymysql
import threading
CONN = pymysql.connect(host='127.0.0.1',
                       port=3306,
                       user='root',
                       password='',
                       database='code_record',
                       charset='utf8')
 
def task(arg):
    cursor = CONN.cursor()
    cursor.execute('select * from userinfo')
    ret = cursor.fetchall()
    cursor.close()
    print(ret)
 
for i in range(10):
    t = threading.Thread(target=task, args=(i,))
    t.start()

 

docker 常用命令

帮助命令

docker version #显示docker的详细信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令 –help #帮助命令

帮助文档的地址:https://docs.docker.com/engine/reference/commandline/

(以下图片均使用kali系统)

1、镜像命令

docker images 查看所有本地的主机上的镜像

┌──(root㉿kali)-[~]
└─# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 12 months ago 13.3kB
# 解释
REPOSITORY 镜像的仓库源
TAG 版本标签信息
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
# 可选项
-a, –all # 列出所有镜像
-q, –quiet # 只列出镜像的id

docker search 搜索镜像

┌──(root㉿kali)-[~]
└─# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13234 [OK]
mariadb MariaDB Server is a high performing open sou… 5062 [OK]
phpmyadmin phpMyAdmin – A web interface for MySQL and M… 640 [OK]
percona Percona Server is a fork of the MySQL relati… 588 [OK]
# 可选项,通过收藏来过滤
–filter=STARS=5000 #搜索出来的镜像就是STARS大于3000的
┌──(root㉿kali)-[~]
└─# docker search mysql –filter=STARS=5000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13234 [OK]
mariadb MariaDB Server is a high performing open sou… 5062 [OK]

docker pull 下载镜像

# 下载镜像 docker pull 镜像名[:tag]

不是很想下,截一下老师的图哈哈哈

image-20221017212936550

docker rmi 删除镜像

┌──(root㉿kali)-[~]
└─# docker rmi -f 镜像id #1.删除指定的镜像id
┌──(root㉿kali)-[~]
└─# docker rmi -f 镜像id 镜像id 镜像id #2.删除多个镜像id
┌──(root㉿kali)-[~]
└─# docker rmi -f $(docker images -aq) #3.删除全部的镜像id

2、容器命令

说明:我们有了镜像才可以创建容器,linux

下载一个centos镜像来测试学习

docker pull centos

新建容器并启动

docker run [可选参数] image
#参数说明
–name=”Name” 容器名字 tomcat01,tomcat02,用来区分容器
–d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P 随机指定端口
# 测试,启动并进入容器
┌──(root㉿kali)-[~]
└─# docker run -it centos /bin/bash
[root@93c15a60f187 /]# ls #查看容器内的centos,基础版本,很多命令不完善
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# 从容器中退回主机
[root@93c15a60f187 /]# exit
exit
┌──(root㉿kali)-[~]
└─#

image-20221017235421425

列出所有的运行的容器

# docker ps 命令
# 列出当前正在运行的容器
-a # 列出当前正在运行的容器+带出历史运行过的容器
-n=? # 显示最近创建的容器
-q # 只显示容器的编号
┌──(root㉿kali)-[~]
└─# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
┌──(root㉿kali)-[~]
└─# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
93c15a60f187 centos “/bin/bash” 7 minutes ago Exited (130) 3 minutes ago funny_jackson
c60fa97d9284 feb5d9fea6a5 “/hello” 4 hours ago Exited (0) 4 hours ago quizzical_pasteur
5ab8620c78f5 medicean/vulapps:s_shiro_1 “/usr/local/tomcat/b…” 2 months ago Exited (143) 2 months ago trusting_mestorf
┌──(root㉿kali)-[~]
└─# docker ps -n=1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
93c15a60f187 centos “/bin/bash” 14 minutes ago Exited (130) 10 minutes ago funny_jackson
┌──(root㉿kali)-[~]
└─# docker ps -aq
93c15a60f187
c60fa97d9284
5ab8620c78f5

退出容器

exit # 直接容器停止并退出
Ctrl + P + Q # 容器不停止退出

删除容器

docker rm 容器id # 删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -f
docker rm -f $(docker ps -aq) # 删除所有的容器
docker ps -a -q|xargs docker rm # 删除所有的容器

启动和停止容器的操作

docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前容器

测试收尾工作(可有可无)

?遇到的问题

1、如何进入正在运行的容器

因为正在运行的容器无法通过容器id删除,所以衍生出了这个问题

解决方法1:使用docker exec

docker exec 相当于进入容器并开启一个新的终端,可以在里面操作。

如果使用exit退出,容器也不会停止。

帮助信息:

注意:因为exec是开始一个新终端,所以COMMAND是必填项,不能省略。

常用命令(其中容器id是你docker中正在运行的容器id):

docker exec -it 容器id /bin/bash

解决方法2:使用docker attach

docker attach 进入容器正在执行的终端,不会启动新的进程。

如果使用exit退出,容器会停止运行!

如果想退出容器但不想容器停止,则按住Ctrl+P+Q退出

帮助信息:

注意:可以很清楚得看到attach命令后面可以直接接容器id即可

常用命令(其中容器id是你docker中正在运行的容器id):

docker attach 容器id

结果:

UNIQUE 约束 pymsql 插入数据

# -*- coding: utf-8 -*-
import pymysql


def insert_db(items_list):
    db = pymysql.connect(host='localhost',
                         database='shops1',
                         user='shops1',
                         port=3306,
                         password='123456')
    cursor = db.cursor()
    insert_sql = "INSERT IGNORE INTO tp_shops(sellerId,shopName) VALUES (%s,%s)"
    try:
        result = cursor.executemany(insert_sql, items_list)
        db.commit()
        return result
    except Exception as e:
        print(e)
        # 如果发生错误则回滚
        db.rollback()
    # 关闭数据库连接
    db.close()


if __name__ == '__main__':
    shop = [565656565, '磬格旗舰店']
    shops = [(894111711, 'aaaaaaaaaa'),(895746871, '6568878787887'),(565656565656666666666, '6568878787887')]
    print(insert_db(shops))