我正在编写一个应用程序,我正在使用MySQL作为DBMS,我们正在下载属性提供,并且存在一些性能问题。旧架构看起来像这样: 房产已更新。如果受影响的行数不是1,则认为更新不成功,否则更新查询解决了我们的问题。 如果更新未成功,并且受影响的行数超过1,则我们会重复并删除所有这些行。如果更新未成功,如果需要删除重复项,则会发生插入。这种架构运行良好,但存在一些速度问题,因为如果属性未更新15天,则会删除属性。 从理论上讲,主要的问题是删除属性,因为有些属性已经存在了好几个月而且索引相距很远(我们讨论的是500,000多个属性)。
我们的主持人告诉我使用replace而不是删除属性,所有弃用的属性都应该被视为DEAD。我已经这样做了,但由于语法错误而开始出现问题,我无法找到任何替换为where子句的示例(我想用新属性替换DEAD属性而不是删除旧属性属性并插入一个新的以确保优化)。我的查询看起来像这样:
replace into table_name(column1, ..., columnn) values(value1, ..., valuen) where ID = idValue
当然,我已经计算了idValue并处理了所有内容,但我遇到了语法错误。我想知道我是否错了,并且有一个where子句可以替换为。
我找到了一个替代解决方案,它甚至比替换(更简单地使用更新查询)更好,因为如果我使用替换,删除会发生在幕后,但我想知道我是否错了我说替换成没有where子句。有关更多参考,请参阅此链接:
http://dev.mysql.com/doc/refman/5.0/en/replace.html
提前感谢您的回答, LajosÁrpád
答案 0 :(得分:25)
我可以看到你已经解决了问题,但回答了原来的问题:
REPLACE INTO
不 有WHERE
条款。
REPLACE INTO
语法完全类似于INSERT INTO
,除了在插入新行之前自动删除具有相同主键或唯一键的任何旧行。
这意味着您应该将主键添加到替换的值以限制更新,而不是WHERE
子句。
REPLACE INTO myTable (
myPrimaryKey,
myColumn1,
myColumn2
) VALUES (
100,
'value1',
'value2'
);
...将提供与...相同的结果。
UPDATE myTable
SET myColumn1 = 'value1', myColumn2 = 'value2'
WHERE myPrimaryKey = 100;
......或更确切地说:
DELETE FROM myTable WHERE myPrimaryKey = 100;
INSERT INTO myTable(
myPrimaryKey,
myColumn1,
myColumn2
) VALUES (
100,
'value1',
'value2'
);
答案 1 :(得分:0)
在您的文档链接中,它们显示replace
命令的三种替代形式。即使被省略,唯一可以接受where子句的是具有尾随select
的第三种形式。
replace
相对于update
似乎有点过分。