Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 不重复行时插入?_Mysql_Insert_Replace_Upsert - Fatal编程技术网

Mysql 不重复行时插入?

Mysql 不重复行时插入?,mysql,insert,replace,upsert,Mysql,Insert,Replace,Upsert,当价格与表中的价格不同时,我只想替换(更新)DATE、PRICE和OLDPRICE,其中MODEL是唯一的 示例行表数据: DATE | MAKE | MODEL | PRICE | OLDPRICE 2012-04-15 | Advance | DTA-100-X | 400 | 390 一定有十几种方法可以做到这一点,但我正在寻找在MySQL查询中使用的最佳解决方案 我应该使用: 在重复密钥更新时插入.. 替换为.. UPDAT

当价格与表中的价格不同时,我只想替换(更新)
DATE
PRICE
OLDPRICE
,其中
MODEL
是唯一的

示例行表数据:

DATE        |   MAKE   |   MODEL   |   PRICE   |   OLDPRICE
2012-04-15  | Advance  | DTA-100-X |   400     |   390
一定有十几种方法可以做到这一点,但我正在寻找在MySQL查询中使用的最佳解决方案

我应该使用:

  • 在重复密钥更新时插入..
  • 替换为..
  • UPDATE…WHERE PRICE!=XXX
  • 如果
    型号
    相同,但
    价格
    不同,则基本语法为
    更新
    <代码>旧价格在
    更新时变为
    价格

    *更新*

    这将替换价格是否更改。我只希望在价格发生变化时进行更新/替换,即不应更新上述示例中给出的任何内容,但确实如此,因为日期不同:

    REPLACE INTO MyTable (DATE, MAKE, MODEL, PRICE, OLDPRICE) VALUES ('2012-10-02', 'Advance', 'DTA-100-X', '400', '390')
    
    MySQL有一个专门用于此目的的工具

    REPLACE的工作原理与INSERT完全相同,只是如果表中的一个旧行与主键或唯一索引的新行具有相同的值,则在插入新行之前会删除旧行


    --

    如果您关心表的顺序,请在重复键更新时使用
    插入..
    <代码>替换
    删除旧行,然后添加新行(如果发现重复)


    插入..在重复键更新时
    会按照名称向表中插入新行,除非存在重复项,在这种情况下,它会更新行(而不是删除行并添加新行),从而使表的顺序相同。

    根据更新,应使用选项1,upsert,aka
    在DULICATE密钥更新时插入…

    我想你是说你只想更新价格和旧价格(不是日期或品牌),如果模型已经存在,价格不同。如果是这样的话,这应该对你有用:

    像这样:

    INSERT INTO MyTable (DATE, MAKE, MODEL, PRICE, OLDPRICE) 
    VALUES ('2012-10-02', 'Advance', 'DTA-100-X', '410', '390')
    ON DUPLICATE KEY UPDATE OLDPRICE = CASE WHEN PRICE != VALUES(PRICE) THEN PRICE ELSE OLDPRICE END,
      DATE = CASE WHEN PRICE != VALUES(PRICE) THEN VALUES(DATE) ELSE DATE END,
      PRICE = VALUES(PRICE);
    

    有用的术语是“upsert”(更新和插入之间的组合)。我使用方法1已经好几年了,效果很好。如果表中没有匹配的键,那么1和2也会向表中插入新数据。但需要注意的是,行实际上是先被删除的。如果您对数据中的暂时不连续性表示满意,那么这很容易做到。好的,这听起来像是我需要的,只要它不插入或更新所有数据,除非该行的
    PRICE
    不同,替换始终执行删除和插入,即使新值与旧值完全相同。@JeremyHolovacs我相信,如果您使用的是支持事务的表引擎(例如Innodb),则每个SQL语句都在事务中运行(除非
    autocommit
    处于关闭状态),并且不存在“瞬间中断”。@asah这可能是真的;它是事务的一个隐含部分,这是有道理的,但除非我在参考手册中看到它,否则我不会相信它。不过,需要注意的是。这似乎比
    替换
    更快,想法?这个问题有点模糊,但鉴于手头的信息,我建议使用此替换,因为它更高效,侵入性更小。好的,谢谢,我还想更新日期,如果价格也发生了变化,谢谢你的澄清。我相应地更新了示例查询。