> ## Documentation Index
> Fetch the complete documentation index at: https://villagesql.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# MySQL の DELETE

> MySQL の DELETE 文が行を削除する仕組み、WHERE をまず SELECT として実行すべき理由、および DELETE と TRUNCATE TABLE の違い。

> [card] [VillageSQL is a drop-in replacement for MySQL with extensions.](https://villagesql.com/docs/en/8.4/stable/install-server.md)
>
> All examples on this page work on VillageSQL. Install Now →

`DELETE` は行全体を削除します。[トランザクション](https://villagesql.com/docs/ja/tutorial/transactions.md)の
外では元に戻せないため、身に付ける価値のある習慣は、まず `WHERE` を書いて、
それが何を選ぶかを見ることです。

これらの例は [INSERT](https://villagesql.com/docs/ja/tutorial/insert.md) の `sakila_practice` データベースを
使います。始める前にそこのセットアップブロックをもう一度実行し、それから
`mysql -u root -p sakila_practice` でクライアントを開いてください。

## DELETE の仕組み

```sql theme={null}
DELETE FROM TABLE_NAME
WHERE CONDITION;
```

`TABLE_NAME` をテーブルに、`CONDITION` を削除する行を選ぶテストに置き換えます。

列リストはありません。`DELETE` は行全体を削除するため、1 つの列を空にするのは、
それを NULL に設定する [UPDATE](https://villagesql.com/docs/ja/tutorial/update.md) です。

## 例

### まず見て、それから削除する

`WHERE` を `SELECT` として書き、これから失う行を読んでください。

```sql theme={null}
SELECT member_id, first_name, last_name FROM member WHERE active = 0;
```

```text theme={null}
+-----------+------------+-----------+
| member_id | first_name | last_name |
+-----------+------------+-----------+
|         3 | Linda      | Williams  |
+-----------+------------+-----------+
1 row in set (0.00 sec)
```

1 行で、それは意図した行です。次に、文の前半を変え、`WHERE` はそのままにします。

```sql theme={null}
DELETE FROM member WHERE active = 0;
```

```text theme={null}
Query OK, 1 row affected (0.00 sec)
```

```sql theme={null}
SELECT member_id, first_name, last_name, active FROM member;
```

```text theme={null}
+-----------+------------+-----------+--------+
| member_id | first_name | last_name | active |
+-----------+------------+-----------+--------+
|         1 | Mary       | Smith     |      1 |
|         2 | Patricia   | Johnson   |      1 |
+-----------+------------+-----------+--------+
2 rows in set (0.00 sec)
```

`DELETE` は影響を受けた行数だけを報告します。`UPDATE` は `Rows matched` と
`Changed` を含む 2 行目を出力しますが、`DELETE` にそれに相当するものはありません。

### 何にも一致しない WHERE はエラーではない

```sql theme={null}
DELETE FROM member WHERE member_id = 99;
```

```text theme={null}
Query OK, 0 rows affected (0.00 sec)
```

何も問題は起きず、何も起きませんでした。動くはずだった削除の後の
`0 rows affected` は、`WHERE` が間違っているという意味ですが、文はそれを教えて
くれません。

## WHERE がないとテーブルを空にする

```sql theme={null}
DELETE FROM member;
```

```text theme={null}
Query OK, 2 rows affected (0.00 sec)
```

```sql theme={null}
SELECT COUNT(*) AS members FROM member;
```

```text theme={null}
+---------+
| members |
+---------+
|       0 |
+---------+
1 row in set (0.00 sec)
```

セーフアップデートモードは、`WHERE` にキーのない `UPDATE` を拒否するのとまったく
同じように、この形を拒否します。[UPDATE](https://villagesql.com/docs/ja/tutorial/update.md) でそれが出す
`ERROR 1175` を示しており、`mysql -u root -p --safe-updates sakila_practice` で
セッション全体に対して有効にできます。

## TRUNCATE は別の方法で空にする

テーブルは空なので、1 行挿入してその id を見てください。

```sql theme={null}
INSERT INTO member (first_name, last_name, joined) VALUES ('Sam', 'Reed', '2026-06-01');
```

```text theme={null}
Query OK, 1 row affected (0.00 sec)
```

```sql theme={null}
SELECT member_id, first_name FROM member;
```

```text theme={null}
+-----------+------------+
| member_id | first_name |
+-----------+------------+
|         4 | Sam        |
+-----------+------------+
1 row in set (0.00 sec)
```

カウンタは `DELETE` が削除した行の続きから進みました。`TRUNCATE TABLE` はそう
しません。

```sql theme={null}
TRUNCATE TABLE member;
```

```text theme={null}
Query OK, 0 rows affected (0.00 sec)
```

```sql theme={null}
INSERT INTO member (first_name, last_name, joined) VALUES ('Sam', 'Reed', '2026-06-01');
```

```text theme={null}
Query OK, 1 row affected (0.00 sec)
```

```sql theme={null}
SELECT member_id, first_name FROM member;
```

```text theme={null}
+-----------+------------+
| member_id | first_name |
+-----------+------------+
|         1 | Sam        |
+-----------+------------+
1 row in set (0.00 sec)
```

`TRUNCATE` はテーブルを削除して空のテーブルを作り直します。何行削除しても
`0 rows affected` と報告するのも、カウンタが最初から始まるのもそのためです。
`WHERE` を取らず、ロールバックできず、`DELETE` トリガーを起動しません。テーブルを
空の状態にリセットするには `TRUNCATE` を、それ以外のすべてには `DELETE` を使って
ください。

## まとめ

* `DELETE FROM table WHERE condition` と書き、まず `WHERE` を `SELECT` として実行します。
* 行数が返り、`Rows matched` の行はないと考えてください。
* `0 rows affected` は失敗ではなく、何も見つけなかった `WHERE` と読んでください。
* `WHERE` を省くとテーブルは空になり、確認のステップはありません。
* テーブルを空にしてリセットするには `TRUNCATE TABLE` を使います。元に戻せないことを承知の上で使ってください。

## 関連項目

* [UPDATE](https://villagesql.com/docs/ja/tutorial/update.md) — 行の変更と、セーフアップデートの保護
* [WHERE](https://villagesql.com/docs/ja/tutorial/where.md) — どの行が消えるかを決める句
* [トランザクション](https://villagesql.com/docs/ja/tutorial/transactions.md) — DELETE を取り消す唯一の方法
* [MySQL のソフトデリート](https://villagesql.com/docs/ja/guides/soft-deletes.md) — 行を削除する代わりに、削除済みとして印を付ける


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.