Php SQL插入到表中会导致重复
我有一个脚本,我为它设置了一个CRON,它通过JSON(cURL)从第三方服务器获取值 现在,每次cron运行时,它都会插入一条全新的记录。导致重复,并导致手动删除重复 如何防止重复,只更新丢失的信息或与新的$VAR值不同的信息 我想做的可以这样表达:Php SQL插入到表中会导致重复,php,mysql,cron,Php,Mysql,Cron,我有一个脚本,我为它设置了一个CRON,它通过JSON(cURL)从第三方服务器获取值 现在,每次cron运行时,它都会插入一条全新的记录。导致重复,并导致手动删除重复 如何防止重复,只更新丢失的信息或与新的$VAR值不同的信息 我想做的可以这样表达:如果旧值不是新值,使用新值,否则使用旧值 if ($stmt->num_rows !== 1) { if ($insert_stmt = $mysqli->prepare("
如果旧值不是新值,使用新值,否则使用旧值代码>
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 ''; }
}
}
}
您应该尝试使用INSERT。。。在重复密钥更新时
这意味着您必须为表定义一些唯一的(可能是主键)键,该键始终保持不变,以便MySQL知道要更新什么
下面是一个简单的示例,说明您将如何执行此操作:
INSERT INTO table (f1,f2,f3) VALUES ('something_unique',2,5)
ON DUPLICATE KEY UPDATE f2=2,f3=5
如果数据库中已存在带有标志UNIQUE
或主键的字段之一,则以下语句将被静默忽略。如果您正在搜索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';
另一个要考虑的事情是句法:
最后,我编写了另一个if语句来检查传入数据中是否存在唯一的值,以及现有的db值是否存在,并将其留空以防止导入重复数据。我还编写了一个单独的文件来更新值,这些值区分了我接收到的内容(新的)和数据库中的内容(旧的),这对我的应用程序非常有用
以下是我对遇到这个问题的其他人的回答:)
还有一个我偶然发现的简单错误报告技巧,它帮助我清理了一些我忽略的事情。只需将其放在文件的顶部,或要调试的上方;)
错误报告(E_ALL)代码>您是否尝试过插入。。。重复密钥更新时为是。你不能插入。。。关于使用重复密钥更新VALUE@MyWay-他需要在INSERT
语句中包含主键
(或者至少是一个唯一的
键),我猜现在还不是这样,@MarkusWMahlberg lol`INSERT INTO。。选择。。从…起在重复键上更新val=VALUES(val)获取将与value()一起插入的值仅与INSERT INTO…一起使用。。。。值(…),以便我可以执行类似于$var=xx123
的操作,并将其作为伪列/值传递给DB表?现在我想起来了。。。这个值在我正在检索的JSON数据中不是唯一的。只有记录
或电子邮件
@abdriusWell才是真正不安静的东西,无论什么是唯一的(并在数据库中设置为一个)都会成功@LeviZoesch-您是否从JSON中获取了成员id(主键
-可能有一个,可能在数据库中称为members.id
)呢?如果是这样,那就是你的独特数据。只需在INSERT
语句中设置members.id
<如果该记录已存在,则会触发重复密钥更新上的代码>
。我要说的是,我从第三方服务器获取的值不包含此新的
虚构的唯一值。这只是站在我这边,那么JSON将如何区别于旧版本呢?我唯一可以交叉引用到数据库中的是记录
列值
不相同@谢谢。最后,我为记录#中的if值为true编写了一个else-if语句。昨晚开始了,但我很感激。请查看我发布的答案@NextLocal@NextLocal
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;
$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
}
}
}