返回顶部
首页 > 资讯 > 数据库 >python 多线程删除MySQL表
  • 593
分享到

python 多线程删除MySQL表

多线程pythonMySQL 2023-01-30 22:01:31 593人浏览 泡泡鱼
摘要

在《python 统计Mysql表信息》这篇博客中,链接如下:https://www.cnblogs.com/xiao987334176/p/9901692.html 已经统计出来了一个mysql服务器的所有表信息,但是还不够,还

在《python 统计Mysql表信息》这篇博客中,链接如下:

https://www.cnblogs.com/xiao987334176/p/9901692.html

 

已经统计出来了一个mysql服务器的所有表信息,但是还不够,还缺2个列。分别是备注和是否使用

库名表名表说明建表语句备注是否使用
db1users用户表CREATE TABLE `users` (...)

log2
CREATE TABLE `log2` (...)废弃

 

 

 

 

注意:前4列,我用Python统计出来了,那么后2列,怎么办呢?

作为一名运维人员,你是不知道线上每个表的使用情况的,但是开发人员是知道的。所以最后2列,扔给开发去填写。

千万不要自作主张的去写,否则,你懂的...

 

OK,历经2天的时间,表终于整理完了。大概有1万条记录!

领导需要将不使用的表,全部删除掉。但是有一个前提:删除之前,一定要做备份。

 

怎么备份呢?有2个方案

1. 使用mysqldump 备份单个表,也就是要删除的表

2. 使用xtraBackup备份mysql

 

那么这2个方案,该如何选择呢?如果你不知道怎么选的时候,可以先用排除法!

mysqldump

先来看第一种方案,使用mysqldump 备份单表

mysqldump -h主机ip -u用户名 -p密码 数据库名 表名> 文件位置.sql

 

注意:对于千万级别以上的表,这个sql文件会非常的大。有办法缩小吗?有,使用gzip

 

gzip

mysqldump 备份并压缩sql文件

mysqldump -h主机ip -u用户名 -p密码(也可不输入) 数据库名 表名  | gzip > 压缩后文件位置.sql.gz

 

mysql直接用压缩文件恢复

gunzip < backupfile.sql.gz | mysql -u用户名 -p密码(也可不输入) 数据库名

 

一个16M的sql文件,使用gzip之后,可以压缩到2.2M。但是我们要知道,备份千万级别的表,非常耗时。

它需要一行行读取,并写入到备份文件中。这还只是单表的情况下,几千张表,就无法想象了!

所以不予采用

 

xtraBackup

具体使用方法,请参考以下链接:

Http://blog.51cto.com/xiao987334176/1693176

 

它是基于文件式的备份,MySQL的数据库的信息,都写在文件中,那么我使用xtraBackup拷贝文件,比用mysqldump 一行行读取快多了!

所以,准予采用!

 

在贴完整代码之前,先来说几个小的知识点,有助于理解代码。

pymysql执行mysql命令

 这是一个查看所有数据库的

复制代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pymysql

class MysqlHelp(object):
    def __init__(self):
        self.username = "root"
        self.passWord = ""
        self.host = "localhost"
        self.port = 3306  # 注意,必须是数字

    def connect(self):  # 连接mysql
        conn = pymysql.connect(
            host=self.host,  # mysql ip地址
            user=self.username,
            passwd=self.password,
            port=self.port  # mysql 端口号,注意:必须是int类型
        )
        return conn

    def command(self,sql):
        cur = self.connect().cursor()  # 创建mysql游标
        cur.execute(sql)
        ret = cur.fetchall()  # 执行结果
        return ret

all_database = MysqlHelp().command('show databases')
print(all_database)

复制代码

 

执行输出:

(('infORMation_schema',), ('abc',), ('db1',), ('mysql',), ('performance_schema',), ('sys',))

 

logging 记录日志

使用logging模块,记录简单的日志。注意:屏幕和文件,会同时写入。屏幕写入,也就是打印在屏幕的意思

复制代码

import logging
logger = logging.getLogger()  # 实例化了一个logger对象
# 在国外叫handler,在中国翻译过来,叫句柄
# 设置文件名和编码
fh = logging.FileHandler('delete.log', encoding='utf-8')  # 实例化了一个文件句柄 # 格式和文件句柄或者屏幕句柄关联
sh = logging.StreamHandler()  # 用于输出到控制台

fmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  # 格式化
fh.setFormatter(fmt)  # 格式和文件句柄或者屏幕句柄关联
sh.setFormatter(fmt)

# 吸星大法
logger.addHandler(fh)  # 吸收写文件功能 和logger关联的只有句柄
logger.addHandler(sh)  # 吸收输出屏幕功能
logger.setLevel(logging.DEBUG)  # 设置警告级别为debug,此处DEBUG源码为DEBUG = 10

logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.critical('critical message')

复制代码

 

执行输出:

2018-11-10 17:46:28,280 - root - DEBUG - debug message2018-11-10 17:46:28,280 - root - INFO - info message2018-11-10 17:46:28,281 - root - WARNING - warning message2018-11-10 17:46:28,281 - root - CRITICAL - critical message

 

为什么要记录日志呢?因为我需要知道,哪些执行成功和失败了,便于后续的操作。

 

获取不使用的表

筛选问题

怎么筛选出没有使用的表呢?有2个方法:

1. 使用xlwr模块,读取出 是否使用 这一列为否的记录。提取出库名和表名!

2. 使用excel的筛选功能

 

先来说第一种,是可以做,但是太麻烦了。再来说,第二种,简单方便。那么我们始终坚持,简单方便的原则,使用第二种方式。

选中所有列,点击筛选,效果如下:

1341090-20181110203536722-846887533.png

 

点击是否使用后面的按钮,勾选否的,点击确定,效果如下:

1341090-20181110203610805-1541148821.png

 

发行库名是空的,就无法知道它是哪个库的。所以,在筛选之前,要把所有的库名补齐,不能留空!

 

使用PyCharm创建delete.txt文件。注意:Pycharm创建的文件是utf-8编码。直接windows右键创建的txt文件,编码是gbk。

最后筛选出为否的记录,删除多余的列,只复制库名和表名到一个delete.txt文件中。

注意:删掉中文标题,效果如下:

1341090-20181110204252488-2091289720.png

 

读取内容函数

如果让一个python新手来读取一个文件,将文件的所有内容输出,并给其他变量调用。那么需要写一个函数,他会这么做

def read_file():  # 读取文件内容
    with open('delete.txt', encoding='utf-8') as f:        return f.read()

 

这样做完全是可以的,但是我要说的是,如果是一个非常大的文件,内存会直接溢出。这是我们不愿意接受的!

其实可以通过生成器来完成

生成器

def read_file():  # 读取文件内容
    with open('delete.txt', encoding='utf-8') as f:        for i in f:            # 返回生成器,节省内存
            yield i.split()

 

注意:生成器,保存的是某种算法,它并不存储真正的值。你调用它一次,它才会将值返回给你。所以非常节省内存!

那么将这个函数的调用复制给一个变量,对这个变量做for循环,就可以得到文件的所有内容。

 

获取CPU核心数

这里为什么要获取CPU核心数呢?先来回顾一个知识点,进程与线程的关系。

进程是资源分配的最小单位,线程是CPU调度的最小单位。每一个进程中至少有一个线程!

假设我的电脑是4核,那么上面的python代码执行之后,只会占用一个核。

对于这样的程序,它并没有充分的利用CPU。如果能开4个进程执行,那么就可以充分利用CPU了。

不同的电脑,配置是一样的,获取CPU核心数,使用以下代码

from multiprocessing import cpu_countprint(cpu_count())

 

 OK,既然获得了CPU核心数,接下来,就是多线程的问题了

 

多线程

例子:

复制代码

import time
from multiprocessing import cpu_count
from multiprocessing import Pool

def del_tad(num):
    time.sleep(1)
    standard_time = time.strftime('%Y-%m-%d %H:%M:%S')
    print("{}, hi {} 执行了".format(standard_time,num))
    return True

if __name__ == '__main__':
    core_count = cpu_count()  # 获取cpu核心数,这里是4个

    p = Pool(core_count)  # 创建进程池
    for i in range(5):
        # 异步执行del_tab方法,根据进程池中有的进程数,每次最多4个子进程在异步执行
        res = p.apply_async(del_tad,args=(i,))

    p.close()  # 关闭进程池
    # 异步apply_async用法:如果使用异步提交的任务,主进程需要使用join,等待进程池内任务都处理完
    # 否则,主进程结束,进程池可能还没来得及执行,也就跟着一起结束了
    p.join()

复制代码

 

执行输出:

2018-11-10 18:26:26, hi 0 执行了2018-11-10 18:26:26, hi 1 执行了2018-11-10 18:26:26, hi 2 执行了2018-11-10 18:26:26, hi 3 执行了2018-11-10 18:26:27, hi 4 执行了

 

可以发现,同时执行的,只有4个。因为CPU核心数是4

 

如果担心CPU满负荷运行会死掉,可以取一半的数量

# CPU核心数取一半,有小数点时,向上取整。担心机器死掉!core_count = math.ceil(cpu_count() / 2)

 

花费时间

秒数

要删除接近1万张表,总得记录,花了多长时间吧!怎么计算呢?很简单

复制代码

import time
startime = time.time()  # 开始时间
# 执行主程序代码...
endtime = time.time()  # 结束时间
take_time = endtime - startime
print("本次花费时间%s秒"%take_time)

复制代码

 

执行输出:

本次花费时间253秒

 

那么问题来了,253秒,你能在1秒钟,算出,它是几分几秒吗? 数学功底比较好的人,可以心算出来。但是普通人,就不行了!

接下来,有一个方法,3行代码,就可以搞定了

 

时分秒

复制代码

take_time = 253
if take_time < 1:  # 判断不足1秒时
        take_time = 1  # 设置为1秒
# 计算花费时间
m, s = divmod(take_time, 60)
h, m = divmod(m, 60)

print("本次花费时间 %02d:%02d:%02d" % (h, m, s))

复制代码

 

执行输出:

本次花费时间 00:04:13

 

哈,怎么样,是不是看着很清爽!简单明了。

注意:take_time不能小于等于0,否则输出会有异样!所以做了一个判断。

 

完整代码

铺垫了这么多,就可以放出完整代码了!

复制代码

#!/usr/bin/env python3
# coding: utf-8

import time
import math
import logging
import pymysql
from multiprocessing import Pool
from multiprocessing import cpu_count

class DeleteTable(object):
    def __init__(self):
        self.username = "root"
        self.password = ""
        self.host = "localhost"
        self.port = 3306  # 注意:必须是数字
        self.file_txt = "delete.txt"  # 删除文件列表
        self.logger = self.logger()  # 日志对象

    def connect(self):  # 连接mysql
        conn = pymysql.connect(
            host=self.host,  # mysql ip地址
            user=self.username,
            passwd=self.password,
            port=self.port  # mysql 端口号,注意:必须是int类型
        )
        return conn

    def logger(self):
        """
        写入日志
        :return: logger对象
        """
        logger = logging.getLogger()  # 实例化了一个logger对象
        # 在国外叫handler,在中国翻译过来,叫句柄
        # 设置文件名和编码
        fh = logging.FileHandler('delete.log', encoding='utf-8')  # 实例化了一个文件句柄 # 格式和文件句柄或者屏幕句柄关联
        sh = logging.StreamHandler()  # 用于输出到控制台

        fmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  # 格式化
        fh.setFormatter(fmt)  # 格式和文件句柄或者屏幕句柄关联
        sh.setFormatter(fmt)

        # 吸星大法
        logger.addHandler(fh)  # 吸收写文件功能 和logger关联的只有句柄
        logger.addHandler(sh)  # 吸收输出屏幕功能
        logger.setLevel(logging.DEBUG)  # 设置警告级别为debug,此处DEBUG源码为DEBUG = 10

        # logger.debug('debug message')
        # logger.info('info message')
        # logger.warning('warning message')

        return logger


    def read_file(self):  # 读取文件内容
        with open(self.file_txt, encoding='utf-8') as f:
            for i in f:
                # 返回生成器,节省内存
                yield i.split()

    def del_tab(self,cur,dbname, table):
        """
        删除表
        :param cur: mysql游标
        :param dbname: 数据库名
        :param table: 表名
        :return: bool
        """
        try:
            # 删除表drop
            cur.execute('drop table {}.{}'.format(dbname, table))
            # ret = cur.fetchall()  # 执行结果
            self.logger.debug('{}.{} 删除成功'.format(dbname,table))  # 写入日志
            return True
        except Exception as e:
            print(e)
            self.logger.critical('{}.{} 删除失败,失败原因:{}'.format(dbname, table,e))
            return False

    def main(self):  # 获取内容
        content = self.read_file()   # 读取文件内容
        # CPU核心数取一半,有小数点时,向上取整。担心机器死掉!
        core_count = math.ceil(cpu_count() / 2)

        cur = self.connect().cursor()  # 创建mysql游标

        p = Pool(core_count)  # 创建进程池

        for i in content:  # 遍历文件
            dbname, table = i  # 数据库和表明
            # 异步执行del_tab方法
            p.apply_async(self.del_tab(cur,dbname, table))

        p.close()  # 关闭进程池
        p.join()  # 等待所有进程结束
        return True

if __name__ == '__main__':
    startime = time.time()
    ret = DeleteTable().main()  # 执行主程序
    endtime = time.time()
    take_time = endtime - startime

    if take_time < 1:  # 判断不足1秒时
        take_time = 1  # 设置为1秒
    # 计算花费时间
    m, s = divmod(take_time, 60)
    h, m = divmod(m, 60)

    print("本次花费时间 %02d:%02d:%02d" % (h, m, s))
    # print("本次花费时间%s"%take_time)


复制代码

 

既然删除脚本,已经写好了。总得测试一下吧!那么多表呀?从哪里搞?

从备份文件,恢复一个到测试机上?卧槽,得花5个多小时呢!太漫长!

 

创建表脚本

诶,既然是要删除指定的表,那么我创建出那么表,不就完事了吗?

表结构不用完全和生产环境一样,弄成统一的模板即可。

日记也不需要记录,临时的而已!

完整代码如下:

复制代码

#!/usr/bin/env python3
# coding: utf-8
# 创建要删除的表,测试删除脚本

import time
import math
import logging
import pymysql
from multiprocessing import Pool
from multiprocessing import cpu_count

class CreateTable(object):
    def __init__(self):
        self.username = "root"
        self.password = ""
        self.host = "localhost"
        self.port = 3306
        self.file_txt = "delete.txt"  # 删除文件列表

    def connect(self):  # 连接mysql
        conn = pymysql.connect(
            host=self.host,  # mysql ip地址
            user=self.username,
            passwd=self.password,
            port=self.port  # mysql 端口号,注意:必须是int类型
        )
        return conn
    
    def read_file(self):  # 读取文件内容
        with open(self.file_txt, encoding='utf-8') as f:
            for i in f:
                # 返回生成器,节省内存
                yield i.split()

    def cre_tab(self,cur,dbname, table):
        """
        创建表
        :param cur: mysql游标
        :param dbname: 数据库名
        :param table: 表名
        :return: bool
        """
        try:
            # 创建表,表结构图方便,统一了
            sql = """CREATE TABLE %s (
              `id` int(11) NOT NULL AUTO_INCREMENT,
              `name` varchar(32) DEFAULT NULL,
              PRIMARY KEY (`id`)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8""" %'{}.{}'.format(dbname,table)
            # print(sql)
            cur.execute(sql)

            print('创建表{}.{}成功'.format(dbname,table))
            return True
        except Exception as e:
            print(e)
            return False
        
    def main(self):  # 获取内容
        content = self.read_file()   # 读取文件内容
        # CPU核心数取一半,有小数点时,向上取整
        core_count = math.ceil(cpu_count() / 2)

        cur = self.connect().cursor()  # 创建mysql游标
        # 创建数据库,由于要删除的只有3个库,这里手动创建一下,就可以了!
        cur.execute('CREATE DATABASE db1 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci')
        cur.execute('CREATE DATABASE db2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci')
        cur.execute('CREATE DATABASE db3 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci')

        p = Pool(core_count)  # 创建进程池

        for i in content:  # 遍历文件
            dbname, table = i  # 数据库和表名
            # 异步执行del_tab方法
            p.apply_async(self.cre_tab(cur,dbname, table))

        p.close()  # 关闭进程池
        p.join()  # 等待所有进程结束
        return True

if __name__ == '__main__':
    startime = time.time()
    ret = CreateTable().main()  # 执行主程序
    endtime = time.time()
    take_time = endtime - startime

    if take_time < 1:  # 判断不足1秒时
        take_time = 1  # 设置为1秒
    # 计算花费时间
    m, s = divmod(take_time, 60)
    h, m = divmod(m, 60)

    print("本次花费时间 %02d:%02d:%02d" % (h, m, s))

复制代码

 

安装MySQL

这里使用的是操作系统是 ubuntu-16.04.5-server-amd64,使用以下命令安装

apt-get install -y mysql-server

 

安装过程中,会提示输入mysql中root用户的密码

1341090-20181123140349046-95624057.png

 再次输入密码

1341090-20181123140435148-129209036.png

 

安装完成之后,mysql会自动启动。使用以下命令进入mysql

mysql -u root -proot

 

 查看所有数据库

复制代码

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
rows in set (0.00 sec)

复制代码

 

允许root用户远程连接

grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
flush privileges;

 

设置监听地址

默认的mysql配置文件是监听127.0.0.1的,如果要远程连接,必须要修改配置文件才行

vim /etc/mysql/mysql.conf.d/mysqld.cnf

找到

bind-address            = 127.0.0.1

改成

bind-address            = 0.0.0.0

 

重启mysql数据库

/etc/init.d/mysql restart

 

使用Navicat软件连接

1341090-20181123140729170-916942036.png

 

能打开,说明连接成功了!

1341090-20181123140740857-1821701322.png

 

 

先执行创建表脚本

再执行删除表脚本

 

查看删除日志文件delete.log

2018-11-10 21:20:57,121 - root - DEBUG - db1.log2 删除成功
...

 

大功告成!

 

上面的脚本在测试环境,执行蛮顺利的。但是在预发布环境测试时,由于疏忽,忘了做备份了。导致测试环境,某些功能出现异常!

需要对相关表做恢复!怎么恢复呢?查看MySQL错误日志,出现了not found的表名,就手动恢复一下!

 

所以,为了线上执行时,避免出现类似问题。将删除操作改为重命名操作,一旦出现问题,可以快速恢复!

这里使用统一后缀名_rolls_royce,意思就是劳斯莱斯

复制代码

#!/usr/bin/env python3
# coding: utf-8

import time
import math
import pymysql
from multiprocessing import Pool
from multiprocessing import cpu_count

class DeleteTable(object):
    def __init__(self):
        self.username = "root"
        self.password = "root"
        self.host = "192.168.91.128"
        self.port = 3306
        self.file_txt = "delete.txt"  # 删除文件列表
        self.prefix = '_rolls_royce'  # 重命名的后缀

    def connect(self):  # 连接mysql
        conn = pymysql.connect(
            host=self.host,  # mysql ip地址
            user=self.username,
            passwd=self.password,
            port=self.port  # mysql 端口号,注意:必须是int类型
        )
        return conn

    def read_file(self):  # 读取文件内容
        with open(self.file_txt, encoding='utf-8') as f:
            for i in f:
                # 返回生成器,节省内存
                yield i.split()

    # def del_tab(self,cur,dbname, table):
    #     """
    #     删除所有表
    #     :param cur: mysql游标
    #     :param dbname: 数据库名
    #     :param table: 表名
    #     :return: bool
    #     """
    #     try:
    #         # 删除表drop
    #         cur.execute('drop table {}.{}'.format(dbname, table))
    #         # ret = cur.fetchall()  # 执行结果
    #         self.write_log('del_ok.log','{}.{} 删除成功'.format(dbname,table))  # 写入日志
    #         return True
    #     except Exception as e:
    #         print(e)
    #         self.write_log('del_error.log','{}.{} 删除失败,失败原因:{}'.format(dbname, table,e))
    #         return False

    def write_log(self,path,content):
        """
        写入日志文件
        :param path:
        :param content:
        :return:
        """
        with open(path,mode='a+',encoding='utf-8') as f:
            content = time.strftime('%Y-%m-%d %H:%M:%S')+' '+content+"\n"
            print(content)
            f.write(content)

    def rename_tab(self,cur,dbname, table):
        """
        重命名所有表
        :param cur: mysql游标
        :param dbname: 数据库名
        :param table: 表名
        :return: bool
        """
        try:
            # 重命名表RENAME
            # ALTER TABLE user10 RENAME TO user11;
            cur.execute('ALTER TABLE {}.{} RENAME TO {}.{}{}'.format(dbname, table,dbname, table,self.prefix))
            # ret = cur.fetchall()  # 执行结果
            self.write_log('rename_ok.log', '{}.{} 重命名表成功'.format(dbname, table))  # 写入日志
            return True
        except Exception as e:
            print(e)
            self.write_log('rename_error.log', '{}.{} 重命名表失败'.format(dbname, table))
            return False

    def recovery_tab(self,cur,dbname, table):
        """
        恢复所有表名
        :param cur: mysql游标
        :param dbname: 数据库名
        :param table: 表名
        :return: bool
        """
        try:
            # 恢复表名
            cur.execute('ALTER TABLE {}.{} RENAME TO {}.{}'.format(dbname, table+self.prefix,dbname, table))
            self.write_log('recovery_ok.log', '{}.{} 恢复表名成功'.format(dbname, table))
            return True
        except Exception as e:
            print(e)
            self.write_log('recovery_error.log','{}.{} 恢复表名失败'.format(dbname, table))
            return False

    def main(self):  # 获取内容
        content = self.read_file()   # 读取文件内容
        # CPU核心数取一半,有小数点时,向上取整
        core_count = math.ceil(cpu_count() / 2)

        cur = self.connect().cursor()  # 创建mysql游标

        p = Pool(core_count)  # 创建进程池

        for i in content:  # 遍历文件
            dbname, table = i  # 数据库和表明
            # 异步执行方法
            p.apply_async(self.rename_tab(cur,dbname, table))

        p.close()  # 关闭进程池
        return True

if __name__ == '__main__':
    startime = time.time()
    ret = DeleteTable().main()  # 执行主程序
    endtime = time.time()
    take_time = endtime - startime

    if take_time < 1:  # 判断不足1秒时
        take_time = 1  # 设置为1秒
    # 计算花费时间
    m, s = divmod(take_time, 60)
    h, m = divmod(m, 60)

    print("本次花费时间 %02d:%02d:%02d" % (h, m, s))
    # print("本次花费时间%s"%take_time)

复制代码

 

执行效果同上!去掉了logger模块,测试发现,多线程执行会重复写入日志!

 

所以执行之后,重命名的表会一直存在,存放个半年左右。等到功能稳定之后,一并删除!


您可能感兴趣的文档:

--结束END--

本文标题: python 多线程删除MySQL表

本文链接: https://lsjlt.com/news/179204.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python 多线程删除MySQL表
    在《python 统计MySQL表信息》这篇博客中,链接如下:https://www.cnblogs.com/xiao987334176/p/9901692.html 已经统计出来了一个MySQL服务器的所有表信息,但是还不够,还...
    99+
    2023-01-30
    多线程 python MySQL
  • mysql多表删除实例
    mysql多表删除删除某学生基本信息的同时,删除该学生的所有成绩mysql> select * from stu_inf; +----+-------...
    99+
    2024-04-02
  • mysql多表联合删除
    文件一:01.txt文件二:02.txt登录mysql选择数据库表user结构表user_depart结构导入数据到表user导入数据到表user_depart联合删除查看删除后user表的数据查看删除后u...
    99+
    2024-04-02
  • MySQL如何删除多表关联
    这篇文章主要介绍MySQL如何删除多表关联,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 在MySQL中,删除关联的多张表,可以使用下面SQLmysql&...
    99+
    2024-04-02
  • python 列表删除多个元素
    文章目录 一. 删除列表多个元素方法1 使用枚举:2. 使用python中List.pop()方法3. 使用python中List.remove()方法4. 注意 二. 使用双指针法删...
    99+
    2023-08-31
    python 开发语言
  • MySQL中怎么删除多表数据
    MySQL中怎么删除多表数据,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。  MySQL删除多表数据有哪些问题  1、delete...
    99+
    2024-04-02
  • MySql怎么批量删除多个表
    项目场景: 使用Navicat工具直接在界面中删除,只能单张表删除,不能多选。 解决方案: 我们可以通过MySQL的语句来批量删除多个表,其中test替换成你要查询的数据库名字。 生成删除某个数据库下所有的表SQL -- 查询构建批...
    99+
    2023-09-15
    mysql 数据库 批量删除 多表删除 drop
  • mysql批量删除多个表的方法
    小编给大家分享一下mysql批量删除多个表的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql批量删除多个表的方法:使...
    99+
    2024-04-02
  • Python列表中多元素删除(移除)的实现
    目录问题背景实现方法1. 使用枚举法2. python中List的内置方法结论问题背景 a=[1,4,2,1,5,6,9,0] #删除列表中的元素,其所在的位置为[1,3,7] de...
    99+
    2023-03-10
    Python列表多元素删除 Python 多元素删除
  • mysql怎么删除表
    mysql怎么删除表?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!mysql怎么删除表?1. 按win+r快捷键...
    99+
    2024-04-02
  • mysql如何删除表
    这篇文章给大家分享的是有关mysql如何删除表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在mysql中,可以利用“DORP TABLE”语句来删除数据表,通用语法格式“DRO...
    99+
    2024-04-02
  • MySQL中怎么实现多表删除操作
    本篇文章为大家展示了MySQL中怎么实现多表删除操作,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。  1、从MySQL数据表t1中把那些id值在数据表t2里有匹配的...
    99+
    2024-04-02
  • 我们如何从 MySQL 表中删除多行?
    我们可以使用 DELETE 语句和 WHERE 子句(该子句标识这些多行)来从 MySQL 表中删除多行。示例mysql> Select * from names; +------+-----------+ | id ...
    99+
    2023-10-22
  • 使用 NodeJS 删除 MySQL 表
    您可以使用 Node.js 中的“DROP TABLE”语句从 MySql 数据库中删除现有表。有时,我们需要删除整个表,尽管在企业中总是建议将不使用的表归档而不是删除它们。在删除表时,我们有两种情况 - p>如果表存在则删除,否则抛出错误...
    99+
    2023-10-22
  • Python列表中多元素删除如何实现
    本篇内容介绍了“Python列表中多元素删除如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题背景a=[1,4,2,1,5,6,9,...
    99+
    2023-07-05
  • Python之列表的删除
    ''' 数据结构之线性结构之列表 : 这里的列表是一种数据存储结构,也即将一块连续的存储空间分配给该变量存储数据.优点在于:查询效率极高,但缺点在于,为保证数据存储的连续性                            每当删除中间...
    99+
    2023-01-31
    列表 Python
  • java多线程删除数据的方法是什么
    Java多线程删除数据的方法有以下几种:1. 使用线程池:可以使用线程池来管理多个线程,每个线程负责删除一部分数据。线程池可以提高线...
    99+
    2023-08-18
    java
  • MySQL怎么创建多个表的更新与删除
    本篇内容主要讲解“MySQL怎么创建多个表的更新与删除”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL怎么创建多个表的更新与删除”吧!1.涉及多个表的更...
    99+
    2024-04-02
  • mysql关联表删除方法
    下面一起来了解下mysql关联表删除方法,相信大家看完肯定会受益匪浅,文字在精不在多,希望mysql关联表删除方法这篇短内容是你想要的。          ...
    99+
    2024-04-02
  • mysql删除不用表数据
    MySQL删除数据几种情况以及是否释放磁盘空间:1、drop table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM ; 2、truncate table tab...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作