MySQL-5.7 DELETE语句详解

1.语法

(1)单表

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

(2)多表

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    tbl_name[.*] [, tbl_name[.*]] ...
    FROM table_references
    [WHERE where_condition]

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    FROM tbl_name[.*] [, tbl_name[.*]] ...
    USING table_references
    [WHERE where_condition]
  • 当您不需要知道已删除行的数目时,TRUNCATE TABLE语句是一个比没有WHERE子句的DELETE语句更快的清空表的方法。与DELETE不同,TRUNCATE TABLE不能在事务中使用,或者在表上有锁。

  • 如果您编写的DELETE语句中没有WHERE子句,则所有的行都被删除。当您不想知道被删除的行的数目时,有一个更快的方法,即使用TRUNCATE TABLE。

  • 如果您删除的行中包括用于AUTO_INCREMENT列的最大值,则该值被重新用于BDB表,但是不会被用于MyISAM表或InnoDB表。如果您在AUTOCOMMIT模式下使用DELETE FROM tbl_name(不含WHERE子句)删除表中的所有行,则对于所有的表类型(除InnoDB和MyISAM外),序列重新编排。对于InnoDB表,此项操作有一些例外。

  • 对于MyISAM和BDB表,您可以把AUTO_INCREMENT次级列指定到一个多列关键字中。在这种情况下,从序列的顶端被删除的值被再次使用,甚至对于MyISAM表也如此。

2.delete用法

(1)单表

mysql> select * from students2;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
|   1 | 555   | 1      |       2 |
|   2 | 555   | 2      |       2 |
|   3 | 555   | 3      |       2 |
|   4 | 555   | 3      |       1 |
|   5 | 555   | 1      |       1 |
+-----+-------+--------+---------+
5 rows in set (0.00 sec)

mysql> delete from students2 where sid=4;
Query OK, 1 row affected (0.05 sec)

mysql> select * from students2;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
|   1 | 555   | 1      |       2 |
|   2 | 555   | 2      |       2 |
|   3 | 555   | 3      |       2 |
|   5 | 555   | 1      |       1 |
+-----+-------+--------+---------+
4 rows in set (0.00 sec)

mysql> delete from students2 limit 1;
Query OK, 1 row affected (0.03 sec)

mysql> select * from students2;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
|   2 | 555   | 2      |       2 |
|   3 | 555   | 3      |       2 |
|   5 | 555   | 1      |       1 |
+-----+-------+--------+---------+
3 rows in set (0.00 sec)

mysql> delete from students2 order by sid desc limit 1;
Query OK, 1 row affected (0.06 sec)

mysql> select * from students2;
+-----+-------+--------+---------+
| sid | sname | gender | dept_id |
+-----+-------+--------+---------+
|   2 | 555   | 2      |       2 |
|   3 | 555   | 3      |       2 |
+-----+-------+--------+---------+
2 rows in set (0.00 sec)

mysql> delete from students2;
Query OK, 2 rows affected (0.04 sec)

mysql> select * from students2;
Empty set (0.00 sec)

(2)多表

  • 被删除的表不能出现在查询子句的子查询中;
  • Low_priority表示删除语句需要等待其他链接的读此表操作结束后再执行,只作用于MyISAM,MEMORY和MERGE存储引擎
  • Quick是在使用MyISAM存储引擎时,删除操作不会合并删除表的索引端节点,这样会在一定程度上加快删除的速度
  • Ignore代表会忽略删除过程中的一些错误
  • order by子句决定了删除数据的顺序,配合limit子句后在某些情况下非常有用
delete from somelog where user='jcole' order by timestamp_column limit 1;

delete t1,t2 from t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3.id;

delete from t1,t2 using t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3.id;

对于多表删除语句,如果想对表使用别名,则只能在table_references子句中使用

delete a1,a2 from t1 as a1 inner join t2 as a2 where a1.id=a2.id;

delete from a1,a2 using t1 as a1 inner join t2 as a2 where a1.id=a2.id;
3.其他用法注意事项

(1)在MyISAM表中,被删除的记录被保留在一个带链接的清单中,后续的INSERT操作会重新使用旧的记录位置。要重新使用未使用的空间并减小文件的尺寸,则使用OPTIMIZE TABLE语句或myisamchk应用程序重新编排表。OPTIMIZE TABLE更简便,但是myisamchk速度更快。

(2)QUICK修饰符会影响到在删除操作中索引端结点是否合并。当用于被删除的行的索引值被来自后插入的行的相近的索引值代替时,DELETE QUICK最为适用。在此情况下,被删除的值留下来的空穴被重新使用。
未充满的索引块跨越某一个范围的索引值,会再次发生新的插入。当被删除的值导致出现未充满的索引块时,DELETE QUICK没有作用。在此情况下,使用QUICK会导致未利用的索引中出现废弃空间。

(3)如果您打算从一个表中删除许多行,使用DELETE QUICK再加上OPTIMIZE TABLE可以加快速度。这样做可以重新建立索引,而不是进行大量的索引块合并操作。

(4)用于DELETE的MySQL唯一的LIMIT row_count选项用于告知服务器在控制命令被返回到客户端前被删除的行的最大值。本选项用于确保一个DELETE语句不会占用过多的时间。您可以只重复DELETE语句,直到相关行的数目少于LIMIT值为止。

(5)如果DELETE语句包括一个ORDER BY子句,则各行按照子句中指定的顺序进行删除。此子句只在与LIMIT联用是才起作用。

(6)如果您使用的多表MySQL DELETE语句包括InnoDB表,并且这些表受外键的限制,则MySQL优化程序会对表进行处理,改变原来的从属关系。

转载于:https://www.cnblogs.com/tongxiaoda/p/7910526.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux系统上安装MySQL-5.7.38,需要按照以下步骤进行操作: 1. 首先,确保你的系统已经安装了wget和tar,可以使用以下命令来安装它们: ``` sudo apt-get update sudo apt-get install wget tar ``` 2. 接下来,使用wget命令下载MySQL-5.7.38安装包,可以从MySQL官方网站上获取下载链接,例如: ``` wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz ``` 3. 下载完成后,使用tar命令解压安装包: ``` tar -zxvf mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz ``` 4. 解压后,将MySQL移动到指定的目录: ``` sudo mv mysql-5.7.38-linux-glibc2.12-x86_64 /usr/local/mysql-5.7.38 ``` 5. 添加MySQL的bin目录到系统的PATH环境变量中,可以编辑~/.bashrc文件并添加以下内容: ``` export PATH=$PATH:/usr/local/mysql-5.7.38/bin ``` 6. 创建MySQL的数据存储目录: ``` sudo mkdir /usr/local/mysql-5.7.38/data ``` 7. 接下来,进入MySQL的安装目录并执行安装脚本: ``` cd /usr/local/mysql-5.7.38 sudo ./bin/mysql_install_db --user=mysql --basedir=/usr/local/mysql-5.7.38 --datadir=/usr/local/mysql-5.7.38/data ``` 8. 安装完成后,启动MySQL服务器: ``` sudo ./bin/mysqld_safe --user=mysql & ``` 9. 最后,进入MySQL控制台: ``` ./bin/mysql -uroot -p ``` 以上为在Linux系统上安装MySQL-5.7.38的步骤。请注意,具体安装过程可能会因系统版本、下载链接等因素而有所不同,建议详细查阅MySQL安装文档和使用说明。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值