替换成where子句吗?

时间:2010-06-09 05:18:16

标签: mysql

我正在编写一个应用程序,我正在使用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

2 个答案:

答案 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似乎有点过分。