mysqlの最後の行を条件付きで削除します

Aug 24 2020

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、最後の行(の最大値id)に移動します。そうでない場合は、削除をスキップしたいと思います。私のsql-newbieの目には、次のような単純なものがあるはずです。fault_codeNULLNULL

SELECT * IF err_history_table.id=max(err_history_table) AND fault_code = 'NULL';

mysqlのドキュメントページで答えが見つかりませんでした。このようなものの簡単な解決策はありますか?

回答

1 forpas Aug 24 2020 at 14:34

idの値をチェックする最大の行を返すサブクエリを使用してこれを行うことができますfault_code

DELETE FROM err_hist_table
WHERE id = (
  SELECT id FROM (
    SELECT * FROM err_hist_table
    ORDER BY id DESC LIMIT 1
  ) t
  WHERE fault_code IS NULL
);

デモをご覧ください。
結果:

| id  | cl  | usr | fault_code |
| --- | --- | --- | ---------- |
| 1   | 1   | pA  | A          |
| 2   | 2   | pA  |            |
| 3   | 3   | pC  | B          |
Marc Aug 24 2020 at 14:21

これがあなたの望むものかどうかは完全にはわかりませんが、うまくいくはずです。MySQLの最新バージョンを使用している場合は、次のようなサブクエリを使用できるはずです。

DELETE FROM err_hist_table WHERE id = (SELECT MAX(id) FROM err_hist_table) AND fault_code IS NULL

もちろん、特定のテーブルではテストされていません。最初にSELECTを実行して、期待どおりに動作することを確認することをお勧めします。

billynoah Aug 25 2020 at 02:51

JOINサブサブクエリを必要とせず、簡潔で読みやすい方法で、単一のを使用して目的の結果を達成できることは言及する価値があります。

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ここでのステートメントでの結合の使用に関するトピックの詳細:https://dev.mysql.com/doc/refman/8.0/en/delete.html#idm45306662494864