【问题标题】:Does replace into have a where clause?replace into 有 where 子句吗?
【发布时间】:2010-06-09 05:18:16
【问题描述】:

我正在编写一个应用程序,我正在使用 MySQL 作为 DBMS,我们正在下载房产报价,但存在一些性能问题。旧架构如下所示: 属性已更新。如果受影响的行数不是 1,则认为更新不成功,否则更新查询解决了我们的问题。 如果更新不成功,并且受影响的行数超过 1,我们有重复,我们将它们全部删除。如果更新不成功,我们删除重复项后,会发生插入。此架构运行良好,但存在一些速度问题,因为如果属性在 15 天内未更新,则会被删除。 从理论上讲,主要问题是删除属性,因为有些属性可以存活数月,而且索引之间的距离很远(我们说的是 500、000 多个属性)。

我们的主人告诉我使用替换成而不是删除属性,并且所有不推荐使用的属性都应该被视为 DEAD。我已经这样做了,但是由于语法错误而开始出现问题,而且我在任何地方都找不到用 where 子句替换的示例(我想用新属性替换 DEAD 属性而不是删除旧的属性并插入一个新的以确保优化)。我的查询如下所示:

replace into table_name(column1, ..., columnn) values(value1, ..., valuen) where ID = idValue

当然,我已经计算了 idValue 并处理了所有事情,但我遇到了语法错误。我想知道我是否错了,并且有一个 where 子句可以替换成。

我找到了一个替代解决方案,它甚至比替换成(仅使用更新查询)更好,因为如果我使用替换成,删除就会在幕后发生,但我想知道我是否错了我说 replace into 没有 where 子句。如需更多参考,请参阅此链接:

http://dev.mysql.com/doc/refman/5.0/en/replace.html

提前感谢您的回答, 拉霍斯阿尔帕德

【问题讨论】:

    标签: mysql


    【解决方案1】:

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

    REPLACE INTO not 是否有 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'
    );
    

    【讨论】:

    • 是的,我已经做到了。我已经运行了一个查询来找到一个“好”的行并更新了该行,这样我就有了一个解决方案,但是在我解决了这个问题之后,我真的很好奇我被告知的是否是真的,并且基于来自这里的答案和我的研究(尝试事情),replace into 缺少 where 子句,所以,replace into 是一个 delete + insert,所以我的索引仍然不会被优化。我只需要那里更新。无论如何,谢谢你的回答。
    【解决方案2】:

    在您的文档链接中,它们显示了replace 命令的三种替代形式。即使省略了,唯一可以接受 where 子句的是带有尾随 select 的第三种形式。

    如果我正确理解你的任务,replace 相对于update 似乎有点矫枉过正。

    【讨论】:

    • 非常感谢您的回答。事实上这是一个矫枉过正,你是绝对正确的,我只是想知道 insert into 是否有一个 where 子句来过滤要替换的内容,因为我们的主机说它有,我想澄清一下(如果我已经找到对此我没有理由不告诉他)替换[LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name,...)] SELECT ... 如果我理解正确,上面的语法是,你说的地方可能会出现。你是对的,但是 where 子句在 select
    • 并且替换成在示例中没有位置,所以,我认为替换成没有位置。
    猜你喜欢
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 2015-05-23
    • 2012-10-08
    相关资源
    最近更新 更多