【问题标题】:php/mysql update a table and insert new record where no match foundphp/mysql 更新表并在未找到匹配项的地方插入新记录
【发布时间】:2011-03-30 13:47:48
【问题描述】:

我想根据另一个表中的值更新一个表。如果不存在记录,则作为新记录插入。此代码正确更新,但不会在不存在记录的地方插入。

$results_google = mysql_query("upadate google set                
    Description = '".mysql_real_escape_string(trim(addslashes(strip_tags($row_first['product_description']))))."',
    Manufacturer = '".$row_first['product_vendor']."',
    Price = '".$row_first['product_price']."',                
    Title ='".$row_first['product_title']."'
    WHERE product_id = '".mysql_real_escape_string($row_first['product_id'])."';");
if(!$results_google) {      
    $google = "insert into `google`(`product_id`,`id`,`Description`,`Link`,`Manufacturer`,`Title`,
        `Price`,`Shipping_Weight`,`Image_Link`,`Brand`,`inv_id`)
        VALUES (
        '".mysql_real_escape_string($row_first['product_id'])."',
        '".mysql_real_escape_string($row_first['product_id'])."',
        '".mysql_real_escape_string(trim(strip_tags(addslashes($row_first['product_description']))))."',
        '".mysql_real_escape_string($row_first['product_link'])."',
        '".mysql_real_escape_string($row_first['product_vendor'])."',
        '".mysql_real_escape_string($row_first['product_title'])."',
        '".mysql_real_escape_string($row_first['product_price'])."',                             
        '".mysql_real_escape_string($row_first['weight'])."',
        '".mysql_real_escape_string($row_first['image_link'])."',
        '".mysql_real_escape_string($row_first['product_vendor'])."',
        '$inventory_id')";
    mysql_query ($google) or die("google".mysql_error());
}

【问题讨论】:

  • 要拥有“如果不存在则插入,如果存在则更新”,请使用REPLACEINSERT ON DUPLICATE KEY UPDATE
  • 这与 PHP5 有什么关系?
  • 你在第 1 行写了“更新”,你能正确缩进你的代码吗?
  • 并且不要从字符串构建 SQL,您的代码不可读,甚至可能不安全。
  • @Konerak:在 99% 的情况下,INSERT ON DUPLICATE KEY UPDATE 是首选,因为 REPLACE 会将表数据分段(因为它实际上执行删除和插入),并且可能默认所有字段t 插入。

标签: php mysql sql


【解决方案1】:

如果您询问如何插入行或更新它(如果它已经存在),您需要查看ON DUPLICATE KEY UPDATEON DUPLICATE KEY UPDATE 将只检查 UNIQUE 索引或主键,因此请确保将导致额外行的不同字段标记为唯一(或者您可以执行多列唯一索引)。

阅读documentation for INSERT ... ON DUPLICATE KEY UPDATE

【讨论】:

  • 这没有回答问题,并且已经在评论中提到了。
  • 在 cmets 出现之前,我正在查找我的答案的 URL,但是是的,Konerak 的评论也解释了该怎么做。我回答了他想做什么的问题,但我没有更正他的代码。无论如何,使用ON DUPLICATE KEY 将迫使 karto 重写整个内容。
  • 问题的题目是“php/mysql update a table and insert new record where no match found.”这就是ON DUPLICATE KEY UPDATE 的目的。
【解决方案2】:

虽然@Konerak 的评论确实是正确的方法,但结合准备好的语句和了解您的数据(将整数转换为ints,对字符串使用字符串函数等),我将回答以下问题为什么您的代码没有按预期工作。

您正在使用带有WHERE 语句的更新查询。如果未找到匹配行,则不会更新任何行,但查询不会返回 false,因为 mysql_query 仅在错误时返回 false 并且未找到要更新的行不是错误。因此,只要您的查询有效,您的 if 语句将始终为 false。

编辑:正如下面评论中提到的,您可以使用mysql_affected_rows() 检查是否没有更新任何行:

if (mysql_affected_rows() == 0)
{
  // insert a record
}

但我真的建议采用 ON DUPLICATE KEY UPDATE 和准备好的语句方式。

【讨论】:

  • 这并不完全正确。如果找到匹配的键,mysql_affected_rows 返回 0,但由于新值与旧值相同,因此未更改该行。如果你在 if 子句中放入一个普通的插入,如果发生这种情况,你会得到一个重复键错误。您要么需要“插入忽略”,要么使用“重复密钥更新”。
猜你喜欢
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多