首页 / PHP 入门教程 / MySQL UPDATE 与 DELETE

PHP 入门教程

MySQL UPDATE 与 DELETE

本教程共 65 篇 · 第 54 篇 · 更新于 2026-07-24 · 约 7 分钟阅读

PHPPHP8MySQLUPDATEDELETETRUNCATE软删除安全

54. MySQL UPDATE 与 DELETE

本节目标:掌握修改和删除数据的语法,理解安全操作规范,避免误删误改数据。

数据的修改和删除是高风险操作。本节讲解语法的同时,重点强调安全注意事项。


1. UPDATE 修改数据

-- 将 id 为 1 的用户年龄改为 26
UPDATE users SET age = 26 WHERE id = 1;

-- 修改多个字段
UPDATE users SET age = 26, status = 2 WHERE id = 1;

-- 将所有用户状态设为 1(无 WHERE,谨慎!)
UPDATE users SET status = 1;
Tip

执行 UPDATE 前,先用同样的 WHERE 条件执行 SELECT,确认影响范围无误。


2. DELETE 删除数据

-- 删除 id 为 1 的用户
DELETE FROM users WHERE id = 1;

-- 删除所有数据(表结构保留)
DELETE FROM users;
Note

DELETE 可以回滚(在事务中),但 TRUNCATE 更快且不可回滚。DROP TABLE 会连表结构一起删除。


3. TRUNCATE 清空表

TRUNCATE TABLE users;
特性DELETETRUNCATE
条件删除支持 WHERE不支持
速度慢(逐行删除)快(删除表再重建)
自增 ID保留当前值重置为 1
事务回滚支持不支持
触发器会触发不会触发

4. PHP 安全更新示例

<?php
$pdo = new PDO('mysql:host=localhost;dbname=my_shop;charset=utf8mb4', 'root', '123456');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 安全的更新:必须带 WHERE
$userId = $_POST['id'] ?? 0;
$newAge = $_POST['age'] ?? 0;

if ($userId <= 0 || $newAge <= 0) {
    die('参数错误');
}

$stmt = $pdo->prepare("UPDATE users SET age = :age WHERE id = :id");
$stmt->execute([':age' => $newAge, ':id' => $userId]);

echo '影响了 ' . $stmt->rowCount() . ' 行';
Note

rowCount() 返回受影响的行数。如果返回 0,可能是条件不匹配或数据无变化。


5. PHP 安全删除示例

<?php
$userId = $_POST['id'] ?? 0;

if ($userId <= 0) {
    die('无效的用户ID');
}

// 先确认用户存在
$check = $pdo->prepare("SELECT id FROM users WHERE id = :id");
$check->execute([':id' => $userId]);

if (!$check->fetch()) {
    die('用户不存在');
}

// 执行删除
$stmt = $pdo->prepare("DELETE FROM users WHERE id = :id");
$stmt->execute([':id' => $userId]);

echo '删除成功';

6. 软删除(推荐做法)

真实项目中很少物理删除数据,而是添加 deleted_at 字段标记删除。

ALTER TABLE users ADD COLUMN deleted_at DATETIME DEFAULT NULL;

-- "删除"用户
UPDATE users SET deleted_at = NOW() WHERE id = 1;

-- 查询时过滤已删除
SELECT * FROM users WHERE deleted_at IS NULL;
Tip

软删除保留了数据,方便恢复和审计。配合唯一索引时,需注意已删除记录的冲突问题。


小结

UPDATEDELETE 必须带 WHERE,否则影响全表。养成先 SELECT 后修改的习惯。生产环境建议使用软删除。


来源:参考了 runoob「PHP MySQL Update/Delete」、php-the-right-way,改写后所得。