2010-06-09 64 views
14

我正在编写一个应用程序,而且我正在使用MySQL作为DBMS,我们正在下载物业优惠,并且出现了一些性能问题。旧的建筑看起来像这样: 属性已更新。如果受影响的行数不是1,那么更新不会被视为成功,否则更新查询将解决我们的问题。 如果更新不成功,并且受影响的行数大于1,则我们有重复项,我们将其全部删除。如果更新不成功,如果需要删除重复项,则会发生插入操作。此架构运行良好,但存在一些速度问题,因为如果15天内未更新,属性将被删除。 理论上主要的问题是删除属性,因为一些属性在几个月内仍然存在,并且索引距离很远(我们正在谈论500,000多个属性)。是否替换成有where子句?

我们的主人告诉我使用replace into而不是删除属性,所有不赞成使用的属性应该被视为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

谢谢你的答案提前, 阿帕德·拉约什

回答

0

在你的文档的链接,他们表现出replace命令三种替代形式。即使消失,唯一可以接受where子句的是第三种形式,尾随select

replace看起来像是相对于update矫枉过正如果我正确理解你的任务。

+0

非常感谢您的回答。事实上,这是一个矫枉过正,你是绝对正确的,我只是想知道,如果插入有一个where子句来过滤要替换的东西,因为我们的主机说它有,我想澄清一下(如果我已经找到出于此我没有看到有理由不告诉他) REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name,...)] SELECT ... 如果我理解正确,那么上面的语法就是,在哪里说出哪里可能出现。你说的对,但是,where子句在select – 2010-06-09 16:20:21

+0

而且替换成没有在那里的例子,所以,我认为替换成没有的地方。 – 2010-06-09 16:58:56

22

我可以看到你已经解决了你的问题,但回答你原来的问题:

REPLACE INTOWHERE条款。

REPLACE INTO语法工作正是INSERT INTO除了所有旧行具有相同主键或唯一键插入新行之前全自动删除。

这意味着,而不是WHERE子句,您应该将主键添加到beeing值替换以限制您的更新。

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

是的,我已经完成了。我运行了一个查询来找到一个“好”行并更新了那一行,这样我就有了一个解决方案,但是在我解决了这个问题之后,我真的很好奇,如果我被告知是真的,并且基于从这里和我的研究(尝试的东西)的答案,替换成缺少一个where子句,所以,替换为删除+插入,所以我的索引仍然不会被优化。我只需要在那里更新。无论如何,谢谢你的回答。 – 2010-06-16 05:57:38

+0

谢谢伊瓦尔。最有用的 – khaverim 2012-08-28 15:42:47