sql语句学习教程10_delete_delete语句_delete大批量删除_sql数据删除_sql增删改语句

教程发布:风哥 教程分类:MySQL教程 更新日期:2020-03-05 浏览学习:127

数据库就是用来存储数据的,所有的数据都根据业务分门别类,存储在对应的表中,所以数据的操作,其实就是对表的数据进行增删改查操作,这些操作采用的是标准SQL的DML操作语言,如insert、delete、update语句,接下来风哥为大家介绍如何使用delete对数据进行删除操作。
1. SQL DELETE语句简介
要从表中删除一行或多行,请使用DELETE语句。 DELETE语句的一般语法如下:
fgedu.net.cn @SQL>DELETE
FROM
    fgedu_table
WHERE
    condition;

首先,提供要删除行的表名称(fgedu_table)。其次,在WHERE子句中指定条件以标识需要删除的行记录。 如果省略WHERE子句,则将删除表中的所有行记录。 因此,应始终谨慎使用DELETE语句。
一般来说,DELETE语句不会将结果集。 但是,它只返回已删除的行数。

2. SQL删除表中的一行
使用以下DELETE语句从itpux_yg表中删除ID为:122的行记录。
fgedu.net.cn @SQL>DELETE FROM itpux_yg
WHERE
    yg_id = 122;

由于WHERE子句包含主键表达式,因此DELETE语句只删除一行。可以使用以下语句验证是否已删除itpux_yg中ID为:122的行记录:
fgedu.net.cn @SQL>SELECT
    COUNT(*)
FROM
    itpux_yg
WHERE
    yg_id = 122;

3. SQL DELETE多行示例要删除表中的多个行记录
请使用WHERE子句中的条件来选择要删除的行记录。
例如,以下语句使用IN运算符来删除itpux_yg表中id为120,121或122的信息。
fgedu.net.cn @SQL>DELETE FROM itpux_yg
WHERE
    yg_id IN (120 , 121, 122);

例如:DELETE来自相关表的行一名员工可能有零个或多个家属,而一个受抚养人只属于一名员工。 itpux_yg表中的yg_id列链接到itpux_yg表中的yg_id列。
员工与家属表之间的关系是一对多的。
从逻辑上讲,如果不引用员工,就不能存在依赖关系。 换句话说,当删除员工信息时,他/她的家属也必须要删除。
例如,要删除员工ID为999和所有员工的依赖项,需要执行两个DELETE语句,如下所示:
fgedu.net.cn @SQL>DELETE
FROM
    itpux_yg
WHERE
    yg_id = 999;

fgedu.net.cn @SQL>DELETE
FROM
    itpux_yg
WHERE
    yg_id = 999;

大多数数据库系统都支持外键约束,因此当删除表中的一行时,外键表中的行也会自动删除。
因此,执行以下DELETE语句时:
fgedu.net.cn @SQL>DELETE
FROM
    itpux_yg
WHERE
    yg_id = 999;

在执行上面语句后,yg_id为999的所有行也会自动删除。
要更有效地从表中删除所有行,可以使用TRUNCATE TABLE语句,而不是使用不带WHERE子句的DELETE语句。

4.SQL DELETE大批量删除数据
假设有一个表(itpux_logs)有1000万条记录,需要在业务不停止的情况下删除其中statusid=1的所有记录,差不多有700万条, 直接执行 DELETE FROM itpux_logs WHERE log_id=1 会发现删除失败,因为lock wait timeout exceed的错误。

因为这条语句所涉及的记录数太多,因此我们通过LIMIT参数分批删除,比如每10000条进行一次删除,那么我们可以利用 MySQL这样的语句来完成:
DELETE FROM itpux_logs WHERE log_=1 ORDER BY log_id LIMIT 10000;
然后分多次执行就可以把这些记录成功删除。

注:
执行大批量删除的时候注意要使用上limit。因为如果不用limit,删除大量数据很有可能造成死锁。
如果delete的where语句不在索引上,可以先找主键,然后根据主键删除数据库。
平时update和delete的时候最好也加上limit 1 来防止误操作。

针对千万级数据量大批量删除的方案如下:

方案1、
直接使用delete
因delete执行速度与索引量成正比,若表中索引量较多,使用delete会耗费数小时甚至数天的时间
 
方案2、
(1)创建临时表,表结构与原表结构相同
(2)将需要保留的数据插入至临时表中
(3)drop原表
(4)将临时表改名为原表名
经过测试,drop表一般耗时在3秒以内
此方案主要耗时步骤为第二步,若需要保留的数据量不大时,此方案是最佳方案

数据库就是用来存储数据的,所有的数据都根据业务分门别类,存储在对应的表中,所以数据的操作,其实就是对表的数据进行增删改查操作,这些操作采用的是标准SQL的DML操作语言,如insert、delete、update语句,接下来风哥为大家介绍如何使用delete对数据进行删除操作。
1. SQL DELETE语句简介
要从表中删除一行或多行,请使用DELETE语句。 DELETE语句的一般语法如下:
fgedu.net.cn @SQL>DELETE
FROM
    fgedu_table
WHERE
    condition;

首先,提供要删除行的表名称(fgedu_table)。其次,在WHERE子句中指定条件以标识需要删除的行记录。 如果省略WHERE子句,则将删除表中的所有行记录。 因此,应始终谨慎使用DELETE语句。
一般来说,DELETE语句不会将结果集。 但是,它只返回已删除的行数。

2. SQL删除表中的一行
使用以下DELETE语句从itpux_yg表中删除ID为:122的行记录。
fgedu.net.cn @SQL>DELETE FROM itpux_yg
WHERE
    yg_id = 122;

由于WHERE子句包含主键表达式,因此DELETE语句只删除一行。可以使用以下语句验证是否已删除itpux_yg中ID为:122的行记录:
fgedu.net.cn @SQL>SELECT
    COUNT(*)
FROM
    itpux_yg
WHERE
    yg_id = 122;

3. SQL DELETE多行示例要删除表中的多个行记录,
请使用WHERE子句中的条件来选择要删除的行记录。
例如,以下语句使用IN运算符来删除itpux_yg表中id为120,121或122的信息。
fgedu.net.cn @SQL>DELETE FROM itpux_yg
WHERE
    yg_id IN (120 , 121, 122);

例如:DELETE来自相关表的行一名员工可能有零个或多个家属,而一个受抚养人只属于一名员工。 itpux_yg表中的yg_id列链接到itpux_yg表中的yg_id列。
员工与家属表之间的关系是一对多的。
从逻辑上讲,如果不引用员工,就不能存在依赖关系。 换句话说,当删除员工信息时,他/她的家属也必须要删除。
例如,要删除员工ID为999和所有员工的依赖项,需要执行两个DELETE语句,如下所示:
fgedu.net.cn @SQL>DELETE
FROM
    itpux_yg
WHERE
    yg_id = 999;

fgedu.net.cn @SQL>DELETE
FROM
    itpux_yg
WHERE
    yg_id = 999;

大多数数据库系统都支持外键约束,因此当删除表中的一行时,外键表中的行也会自动删除。
因此,执行以下DELETE语句时:
fgedu.net.cn @SQL>DELETE
FROM
    itpux_yg
WHERE
    yg_id = 999;

在执行上面语句后,yg_id为999的所有行也会自动删除。
要更有效地从表中删除所有行,可以使用TRUNCATE TABLE语句,而不是使用不带WHERE子句的DELETE语句。

4.SQL DELETE大批量删除数据
假设有一个表(itpux_logs)有1000万条记录,需要在业务不停止的情况下删除其中statusid=1的所有记录,差不多有700万条, 直接执行 DELETE FROM itpux_logs WHERE log_id=1 会发现删除失败,因为lock wait timeout exceed的错误。

因为这条语句所涉及的记录数太多,因此我们通过LIMIT参数分批删除,比如每10000条进行一次删除,那么我们可以利用 MySQL这样的语句来完成:
DELETE FROM itpux_logs WHERE log_=1 ORDER BY log_id LIMIT 10000;
然后分多次执行就可以把这些记录成功删除。

注:
执行大批量删除的时候注意要使用上limit。因为如果不用limit,删除大量数据很有可能造成死锁。
如果delete的where语句不在索引上,可以先找主键,然后根据主键删除数据库。
平时update和delete的时候最好也加上limit 1 来防止误操作。

针对千万级数据量大批量删除的方案如下:

方案1、

sql语句学习教程10_delete_delete语句_delete大批量删除_sql数据删除_sql增删改语句此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“fgedu”,获取验证码。在微信里搜索“风哥数据库运维”或者“itpux_com”或者微信扫描右侧二维码都可以关注本站微信公众号。
此方案主要耗时步骤为第二步,若需要保留的数据量不大时,此方案是最佳方案

网站声明:本文由风哥整理发布,转载请保留此段声明,本站所有内容将不对其使用后果做任何承诺,请读者谨慎使用!
【上一篇】sql语句学习教程11_drop_drop语句_truncate_truncate语句_sql删除数据
【下一篇】sql语句学习教程09_insert_insert语句_insert语法_sql数据插入_sql增删改语句