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这可能是真的;它是事务的一个隐含部分,这是有道理的,但除非我在参考手册中看到它,否则我不会相信它。不过,需要注意的是。这似乎比替换
更快,想法?这个问题有点模糊,但鉴于手头的信息,我建议使用此替换,因为它更高效,侵入性更小。好的,谢谢,我还想更新日期,如果价格也发生了变化,谢谢你的澄清。我相应地更新了示例查询。