You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PDO操作中防止插入重复值?

实现PDO插入class_name时限制重复值的方案

要避免向tbl_class表插入重复的class_name,最可靠的方案是数据库层面加约束,再配合代码处理逻辑,以下是具体实现步骤:

一、数据库层面:添加唯一约束

先给class_name字段添加唯一索引,从根源阻止重复值插入,同时避免并发场景下的竞态问题:

ALTER TABLE tbl_class ADD UNIQUE INDEX idx_class_name (class_name);

二、代码层面的三种处理方式

方式1:使用INSERT IGNORE

INSERT IGNORE会忽略重复值的插入操作,不会抛出错误,通过rowCount()判断是否成功插入:

if($_GET["data"] == "add_class"){
    $name = $_POST["txtName"];
    $sql = "INSERT IGNORE INTO tbl_class (class_name) VALUES (:class_name);";
    $insert = $conn->prepare($sql);
    $insert->bindParam(':class_name', $name);

    if($insert->execute()){
        if($insert->rowCount() > 0){
            echo json_encode("Insert Success");
        } else {
            echo json_encode("Class name already exists");
        }
    } else {
        echo json_encode("Insert Failed");
    }    
}

方式2:使用ON DUPLICATE KEY UPDATE

如果需要在重复时执行更新操作(比如更新修改时间),可以用该语法;若无需更新,也可以写空操作避免报错:

if($_GET["data"] == "add_class"){
    $name = $_POST["txtName"];
    // 这里以空更新为例,如需更新字段可替换为实际逻辑,比如 update_time = NOW()
    $sql = "INSERT INTO tbl_class (class_name) VALUES (:class_name) ON DUPLICATE KEY UPDATE class_name = class_name;";
    $insert = $conn->prepare($sql);
    $insert->bindParam(':class_name', $name);

    if($insert->execute()){
        // rowCount()返回1表示插入成功,返回2表示执行了更新(即值已存在)
        if($insert->rowCount() == 1){
            echo json_encode("Insert Success");
        } else {
            echo json_encode("Class name already exists");
        }
    } else {
        echo json_encode("Insert Failed");
    }    
}

方式3:捕获PDO异常

先确保PDO连接时开启异常模式,然后捕获唯一约束冲突的异常(MySQL错误码为1062):

// 假设PDO连接已开启异常模式,示例:
// $conn = new PDO($dsn, $user, $pwd, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);

if($_GET["data"] == "add_class"){
    $name = $_POST["txtName"];
    $sql = "INSERT INTO tbl_class (class_name) VALUES (:class_name);";
    $insert = $conn->prepare($sql);
    $insert->bindParam(':class_name', $name);

    try {
        $insert->execute();
        echo json_encode("Insert Success");
    } catch(PDOException $e) {
        // 捕获唯一约束冲突错误
        if($e->getCode() == 1062){
            echo json_encode("Class name already exists");
        } else {
            echo json_encode("Insert Failed: " . $e->getMessage());
        }
    }    
}

内容的提问来源于stack exchange,提问作者Veasna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:06:46