2012-08-31 66 views
4

我有MySQL的REPLACE INTO只有一些領域

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; 

一個MySQL表,當我嘗試更新與此

REPLACE INTO gfs(localidad,fecha,pp) VALUES ("some_place","2012-08-05 02:00","1.6") 

先前值的字段連接臨時丟失。爲什麼?

回答

4

因爲這是一個REPLACE聲明而不是UPDATE。替換時,您將獲得未指定的值作爲默認列值。

更新允許您更改以前的值,並且也可以在未事先選定的情況下對該值進行操作(SET count = count+1)。它允許所有以前設置的值保持設置。這就是你想要做的。

19

由於REPLACE Syntax記錄下被他人已經提到:

REPLACE是一個MySQL擴展到SQL標準。它或者插入,或者刪除和插入。對於另一個標準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);