有条件地删除mysql中的最后一行

有条件地删除mysql中的最后一行,mysql,Mysql,如何有条件地删除mysql表中的最后一行 me/my_machine@17:26:57>cat create_tables.sql CREATE DATABASE IF NOT EXISTS test_db; USE test_db; CREATE TABLE IF NOT EXISTS err_hist_table ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, cl INT NOT NULL, usr VARCHAR(16),

如何有条件地删除mysql表中的最后一行

me/my_machine@17:26:57>cat create_tables.sql
CREATE DATABASE IF NOT EXISTS test_db;

USE test_db;
CREATE TABLE IF NOT EXISTS err_hist_table (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  cl INT NOT NULL,
  usr VARCHAR(16),
  fault_code VARCHAR(10));

INSERT INTO err_hist_table (cl,usr,fault_code) VALUES (1,'pA','A'), (2,'pA','NULL'),(3,'pC','B'),(4,'pB','NULL');
上述SQL命令创建的表如下所示:

MySQL [test_db]> SELECT * FROM err_hist_table;
+----+----+------+------------+
| id | cl | usr  | fault_code |
+----+----+------+------------+
|  1 |  1 | pA   | A          |
|  2 |  2 | pA   | NULL       |
|  3 |  3 | pC   | B          |
|  4 |  4 | pB   | NULL       |
+----+----+------+------------+
4 rows in set (0.00 sec)
DELETE FROM err_hist_table WHERE id = (SELECT MAX(id) FROM err_hist_table) AND fault_code IS NULL
现在我只想在fault_code的值为NULL时删除id的最后一行最大值。如果不为空,我想跳过删除。 在我的sql新手眼里,似乎应该有一个简单的东西,比如:

选择*IF err_history_table.id=maxerr_history_table和fault_code='NULL'


我在mysql文档页面上找不到我的答案。有这样的简单解决方案吗?

我不完全确定这是否是您想要的,但它应该会起作用。如果您有最新版本的MySQL,您应该能够使用子查询,如下所示:

MySQL [test_db]> SELECT * FROM err_hist_table;
+----+----+------+------------+
| id | cl | usr  | fault_code |
+----+----+------+------------+
|  1 |  1 | pA   | A          |
|  2 |  2 | pA   | NULL       |
|  3 |  3 | pC   | B          |
|  4 |  4 | pB   | NULL       |
+----+----+------+------------+
4 rows in set (0.00 sec)
DELETE FROM err_hist_table WHERE id = (SELECT MAX(id) FROM err_hist_table) AND fault_code IS NULL

当然,没有在你的特定表格上测试过。我甚至建议先执行SELECT来验证它是否符合您的预期。

您可以使用子查询来执行此操作,该子查询返回检查故障代码值的最大id行:

看。 结果:


值得一提的是,您可以使用单个连接实现所需的结果,而不需要子查询,并且在我看来,这种方式既简洁又可读:

DELETE e1 FROM err_hist_table e1
JOIN (
    SELECT MAX(id) AS id
    FROM err_hist_table
) e2 USING (id)
WHERE e1.fault_code = 'NULL'

有关在DELETE语句中使用联接的更多信息,请参见此处:

您尝试过什么吗?如果是,什么?如果不是,为什么不?可能已经在这里得到了回答:是否仅当fault_代码为NULL时才删除id值最大的行?请在这里写下您尝试过的内容。粗略地说:注意,更常见的做法是将“NULLs”存储为NULL,在这种情况下,比较将是X.FultTyCal码是空的,你需要考虑在你的请求中可以插入新的RANIN任何大系统。这个语句无论如何都没有任何意义,但技术上说你是真的。您可以在它周围加上一个锁TABLES err_hist_table WRITE和UNLOCK TABLES,确保在执行时不会发生任何写入。这对性能很糟糕,但可以做到。其中id=SELECT MAXid FROM err_hist_table在MySql中永远不会起作用。错误是:无法为从子句OK中更新指定目标表“err\u hist\u table”,因此实际上需要先执行选择,然后执行删除。我没想到会失败。