我有一个带
的mysql表CREATE TABLE `gfs` (
`localidad` varchar(20),
`fecha` datetime,
`pp` float(8,4) NOT NULL default '0.0000',
`temp` float(8,4) NOT NULL default '0.0000',
PRIMARY KEY (`localidad`,`fecha`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
当我尝试使用此
更新字段时REPLACE INTO gfs(localidad,fecha,pp) VALUES ("some_place","2012-08-05 02:00","1.6")
以前的值en temp丢失了。为什么?
答案 0 :(得分:21)
正如REPLACE
Syntax所述,其他人已经提到过:
REPLACE
是SQL标准的MySQL扩展。它可以插入,也可以删除和插入。对于标准SQL的另一个MySQL扩展 - 插入或更新 - 请参阅Section 13.2.5.3, “INSERT ... ON DUPLICATE KEY UPDATE
Syntax”。
手册继续解释:
所有列的值都取自
REPLACE
语句中指定的值。任何缺失的列都设置为默认值,就像INSERT
一样。您不能引用当前行中的值并在新行中使用它们。
因此,您需要:
INSERT INTO gfs (localidad, fecha, pp)
VALUES ('some_place', '2012-08-05 02:00', 1.6)
ON DUPLICATE KEY UPDATE pp=VALUES(pp);
答案 1 :(得分:4)
因为它是REPLACE
语句而不是UPDATE
。替换时,您将获取未指定的值作为默认列值。
更新允许您更改之前的值,并且在未事先选择该值的情况下对该值进行操作(SET count = count+1
)。它允许所有先前设置的值保持设置。这就是你想要做的。
答案 2 :(得分:2)
来自http://dev.mysql.com/doc/refman/5.0/en/replace.html:
REPLACE的工作原理与INSERT完全相同,只是如果在一个旧行中 table与PRIMARY KEY或UNIQUE的新行具有相同的值 index,在插入新行之前删除旧行。
您是否尝试进行UPDATE?