mysql替换为SET-syntax会覆盖所有字段

时间:2015-08-10 16:15:02

标签: php mysql

我有以下查询:

REPLACE INTO `oxarticles`
SET  
    OXID = '10-1010',  
    oxartnum = '10-1010', 
    oxtitle = 'Dummy',  
    oxprice = '10.000000',  
    oxstock = '100',  
    importstatus = 1"

这可以达到预期的效果,但我没有指定的字段只是用' ' /空字符串覆盖。从我读到的,这个语法应该像UPDATE - 命令一样工作。

我错过了什么吗?如何防止将字段替换为“?”

修改1

为了澄清,我不能只使用UPDATE。我在每次运行之前和导入到1期间将标志(importstatus)设置为0.导入完成后,我删除所有仍处于状态0的文章。

//仅仅是为了竞争,这里是PHP-snippet:

while (!feof($this->handle))
    {
        $row = fgetcsv($this->handle, 0, ";");

        $sSql = "REPLACE INTO oxarticles SET "
                . " OXID = '" . $row[0] . "', "
                . " oxartnum = '" . $row[0] . "', "
                . " oxtitle = '" . $row[1] . "', "
                . " oxprice = '" . str_replace(",", ".", $row[4]) . "', "
                . " oxstock = '" .  str_replace(",", ".", $row[5]) . "', "
                . " importstatus = 1";



        // $sSql = "UPDATE oxarticles SET oxtitle ='" . $row[1] . "', oxprice='" . $row[4] . "', oxstock='" . $row[5] . "' WHERE oxartnum ='".$row[0]."'";
        $this->db->execute($sSql);
    }

2 个答案:

答案 0 :(得分:1)

来自mysql文档:

  

REPLACE的工作原理与INSERT完全相同,只是如果在一个旧行中   table与PRIMARY KEY或UNIQUE的新行具有相同的值   index,在插入新行之前删除旧行。看到   第13.2.5节“INSERT语法”。

换句话说,该行正在删除然后插入,因此您的旧值不会保持不变。也许您可以先选择原始行,然后在适当的位置返回这些值。

答案 1 :(得分:1)

如果您没有为将设置为null的字段提供数据,则查询将把旧数据替换为新数据。如果您不想丢失数据,只想在重复密钥更新时更新字段使用。

{{1}}
  

INSERT INTO表(id,a,b,c,d,e,f,g)VALUES(1,2,3,4,5,6,7,8)ON   重复密钥       更新a = a,b = b,c = c,d = d,e = e,f = f,g = g;