SQL INSERT INTO表导致重复

时间:2015-11-18 09:10:16

标签: php mysql cron

我有一个脚本,我设置了一个CRON,它通过JSON(cURL)从第三方服务器获取值

现在,每次cron运行时,它都会插入一条全新的记录。导致重复,导致我手动删除重复。

我如何防止重复,只更新丢失或与NEW $ VAR值不同的信息?

我想做的事情可以这样表达:IF old value is NOT new value use new value else use old value;

    if ($stmt->num_rows !== 1) {
    if ($insert_stmt = $mysqli->prepare("
                                        INSERT INTO members (
                                                            start_date
                                                            )

                                        VALUES (?)")) 

        {
        $insert_stmt->bind_param('s',
                                $StartDate, 

                                );

    if (! $insert_stmt->execute()) { echo ''; }
        }
}
}

3 个答案:

答案 0 :(得分:1)

您应该尝试使用INSERT ... ON DUPLICATE KEY UPDATEDocumentation

这意味着您必须为表定义一些唯一(可能是 primary )键,该表始终是常量,因此MySQL知道要更新的内容。

一个快速举例说明如何做到这一点:

INSERT INTO table (f1,f2,f3) VALUES ('something_unique',2,5) 
ON DUPLICATE KEY UPDATE f2=2,f3=5

答案 1 :(得分:1)

如果数据库中已存在标记为UNIQUEPRIMARY KEY的字段之一,则将以静默方式忽略以下语句。如果您正在搜索INSERT IF NOT EXISTS,这可能就是您正在寻找的内容:

INSERT IGNORE INTO `members` SET name='Steve',start_date='2015-11-20';

您还可以使用REPLACE覆盖已存在的记录。如果它还没有存在,它将被创建:

REPLACE INTO `members` SET name='Steve',start_date='2015-11-20';

要考虑的另一件事是INSERT ... ON DUPLICATE KEY UPDATE语法:

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;

答案 2 :(得分:0)

我最后写了另一个if语句来检查传入和现有db值是否存在唯一值,并将其留空以防止它导入重复项。我还写了一个单独的文件来更新值,区分我收到的(新)和数据库(旧)的内容,这对我的应用程序来说非常有用。

以下是遇到此问题的其他人的答案:)

$prep_stmt = "SELECT * FROM table WHERE column_keys=?";
    $stmt = $mysqli->prepare($prep_stmt);

    if ($stmt) {
        $stmt->bind_param('s',$varvalues);
        $stmt->execute();
        $stmt->store_result();

        if ($stmt->num_rows == 1) {

        if ($insert_stmt = $mysqli->prepare("")) {
            $insert_stmt->bind_param('');

            if (! $insert_stmt->execute()) { 
                echo 'shits broke'; }
            }
        } 
        else { if ($insert_stmt = $mysqli->prepare("
                                            INSERT INTO table (column_keys)
                                            VALUES (?)")) // you will need a ? per column seperate by a , (?,?,?...?)

            { $insert_stmt->bind_param('s',
                                    $varvalues
                                    ); // you will also need to bind a 's' (string) 'i' for num, etc per $var value.

        if (! $insert_stmt->execute()) { echo 'shits broke';} //lol 
            }
    }
    }

此外,我偶然发现了一个简单的错误报告技巧,帮助我清理了一些我忽略的事情。只需将其放在文件的顶部,或者您要调试的上方;)

error_reporting(E_ALL);