有条件地删除mysql中的最后一行
如何有条件地删除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),
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”,因此实际上需要先执行选择,然后执行删除。我没想到会失败。