2020-11-19 11:15

我们将通过一些有用的示例来说明如何使用MySQLDelete

导读在本教程中,我们将通过一些有用的示例来说明如何使用MySQL Delete。在使用MySQL数据库时,在几种情况下,您可能希望从一个或多个表中删除

在本教程中,我们将通过一些有用的示例来说明如何使用MySQL Delete。在使用MySQL数据库时,在几种情况下,您可能希望从一个或多个表中删除现有记录。

本教程涵盖以下内容:

何时通过删除操作使用订单?

使用QUICK选项删除记录

使用LOW_PRIORITY选项删除记录

使用INNER联接从多个表中删除记录

删除特定行

删除多行(使用数字列匹配)

删除多行(使用字符串列匹配)

使用LIMIT选项删除记录

删除与截断(用于删除所有行)

使用IGNORE选项删除记录

要从表中删除记录,您应该对试图从中删除行的特定表具有DELETE特权。

在本教程中,我们将使用以下雇员表作为示例。

如果您不熟悉MySQL,则可能应该首先了解MySQL基础知识,包括如何创建MySQL数据库。

1.删​​除特定行

要删除特定行,应使用主列值之一或唯一列值指定WHERE条件。

下面的示例将从雇员表中删除ID为100的一条记录。

在上面的输出中:

delete命令的输出将显示删除了多少条记录。从上面的输出中可以看到,它说“ 1行受影响”,这意味着它已删除一行。

如果执行了查询,则输出还将显示“ Query OK”。如果存在语法错误,它将在此处显示。即使没有删除任何记录,只要没有语法错误并且语句是干净的,该行仍会显示“ Query OK”。最后,这还将显示MySQL执行查询所花费的时间(例如:0.01秒)。

现在从雇员表中删除ID为100的第一条记录。

2.使用字符串列匹配删除多行

您可以通过将字符串列与某些条件匹配来从表中删除记录。

对于字符串,您可以使用关键字“ like”进行部分匹配。对于部分匹配,请在值列中使用%。

以下示例将从雇员表中删除记录,其中dept列中的值以“ Tech”开头。因此,这将删除部门为“技术”的所有记录。

上面的输出表明它已删除3条记录。从以下输出中可以看到,我们不再看到带有部门“技术”的记录。

我们在MySQL select命令教程中讨论了许多有关各种实际WHERE条件的信息。了解如何在DELETE语句期间有效使用WHERE子句非常有帮助:25基本的MySQL Select命令示例

3.使用数字列匹配删除多行

与上面的数字列示例类似,您也可以通过将字符串列与某些条件匹配来从表中删除记录。

以下将从工资表中删除薪水小于或等于700的记录。

上面的命令从我们的员工表中删除了4条记录。我们目前只剩下一个记录。

4.使用LIMIT选项删除行

即使where子句与许多记录匹配,您仍然可以使用LIMIT选项限​​制应删除的记录数量。

当delete命令花费很长时间并且您希望将delete操作分解为多个块时,这非常有用。例如,如果要删除100,000条以上的记录,则可以使用LIMIT 10000一次仅删除10,000条记录。

例如,以下不带任何LIMIT选项的delete命令将删除所有匹配的记录。即,这已删除5条记录。

但是,当您使用LIMIT选项时,即使匹配5条记录,以下内容也将仅删除2条记录。

再次执行相同的delete命令,这将删除另外2条记录。

当您再次执行它时,它仅删除了一条记录,因为这是最后一条匹配的记录。

现在,我们没有其他要删除的匹配记录。

5.删除与截断(用于删除所有行)

要删除表中的所有行时,可以使用DELETE或TRUNCATE命令,如下所示。两者都会做同样的事情。但是,有所不同。

以下是有关DELETE与TRUNCATE的几点了解:

截断比删除快得多。如果您只想快速清空表,请使用truncate。

删除是DML语句。截断是DDL语句。

当您执行Truncate命令时,它确实会删除表并重新创建空表。这是截断非常快的原因,因为它不会像DELETE命令那样一一删除记录。

如果特定表上有锁,则不能使用truncate命令。

从上面的truncate命令输出中可以看到,它没有显示删除多少行。即使它截断了包含多行的表,它也只会说“受影响的0行”。

因此,如果您需要知道在擦除表期间删除了多少条记录,则应使用delete。

如果表上有按删除操作触发器,则在执行truncate命令时,将不会执行这些触发器。

最后,一个重要的区别是:执行truncate命令时,无法回滚。但是,当您执行delete命令时,您可以回滚。截断执行隐式提交。

6.使用IGNORE选项删除行

当您想忽略真正的有效错误消息(您知道特定的DELETE命令将抛出该错误消息)时,可以将IGNORE关键字与delete命令(即DELETE IGNORE)一起使用。

因此,当您使用DELETE IGNORE时,如果有任何有效的错误消息,它将仅被视为警告。使用DELETE IGNORE时必须特别小心,尤其是在具有外键的表上,因为delete ignore只会删除记录而无需担心任何外部外键依赖项。

从上面的输出中可以看到,即使存在外键依赖性,删除忽略操作也会从表中删除记录。它只是将那些真正的错误消息视为警告。

7.为什么在删除时使用Order by?

您可以将Order by子句与Delete命令一起使用。

当您希望按特定顺序删除行时,这将非常有用。

在delete命令中,当您结合使用“ order by”和“ limit”选项时,可以做一些巧妙的技巧。

例如,当您执行以下不带“ order by”子句的删除命令时,这将删除ID为100的员工记录(即“技术”部门中最老的员工)。

上面的命令已删除员工ID 200(最老的技术员工)。

但是,如果您将ORDER by和LIMIT相结合,如下所示,您也可以删除“技术”部门的最新雇员。

上面的命令已删除员工ID 500(最新技术员工)。

另外,请记住,要删除特定顺序的记录时可以使用ORDER BY子句,以避免任何参照完整性约束。

8.使用QUICK选项删除行

对于具有某些索引的巨大表,可以使用QUICK选项加快删除操作,如下所示。

在“删除”中,当您使用QUICK选项时,它不会合并索引叶子,这可能会加快删除操作的速度,具体取决于表上的索引类型。

9.使用LOW_PRIORITY选项删除行

当您尝试从使用频繁的表中删除记录时,低优先级关键字非常有用。

LOW_PRIORITY关键字仅在以下存储引擎上有效:MyISAM,MEMORY和MERGE。即,您只能在实现表级锁定的数据库存储引擎上使用此功能。

当您使用LOW_PRIORITY关键字时,仅当没有其他人正在从表中读取时,才发生删除操作。

10.使用INNER Join从多个表中删除

在前面的所有示例中,我们使用delete命令仅从单个表中删除记录。

您可以通过两种方式指定从多个表中删除记录。

在第一种方法中,可以在“ FROM”关键字之前指定要从中删除记录的表,如下所示。以下内容将从雇员和福利表中删除与where条件中指定的条件相匹配的记录。

在第二种方法中,您可以在“ FROM”关键字之后指定要从中删除记录的表,如下所示。以下将删除员工和福利中符合where条件中指定条件的记录。