我有以下查询:
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);
}
答案 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;