2015-10-20 136 views
1

我想知道的解決方案非常有名插入如果不存在更新如果存在插入如果不存在UPDATE如果存在不起作用

但我的不工作。我不知道爲什麼,有人能弄明白嗎?

這是我還沒有嘗試過:

$qprep = ("INSERT INTO gpsdata (`imei`,`latitude`,`longitude`) 
VALUES ('$imei','$lathex1','$lonhex1') ON DUPLICATE KEY UPDATE 
latitude='$lathex1',longitude='$lonhex1';"); 

我想更新的行如果相同的「IMEI」就在那裏,或插入如果它不是。 我有我的作爲主鍵和從phpmyadmin,我做了imei「唯一」。

我在做什麼錯?

我的SQL DUMP:

CREATE TABLE IF NOT EXISTS `gpsdata` (
    `ROW` int(11) NOT NULL AUTO_INCREMENT, 
    `IMEI` varchar(255) NOT NULL, 
    `Latitude` varchar(255) NOT NULL, 
    `Longitude` varchar(255) NOT NULL, 
    PRIMARY KEY (`ROW`), 
    UNIQUE KEY `IMEI` (`IMEI`,`Latitude`,`Longitude`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=36 ; 

-- 
-- Dumping data for table `gpsdata` 
-- 

INSERT INTO `gpsdata` (`ROW`, `IMEI`, `Latitude`, `Longitude`) VALUES 
(24, '#2:359672050035420:2:*', '90.370803333333', '0'), 
(30, '#2:359672050035420:2:*', '90.370803333333', '23.7584'), 
(27, '#2:359672050035420:2:*', '90.370803333333', '23.75854'), 
(35, '1:135790246811221:1:*', '1.0961283333333', '1.759595'), 
(32, '1:135790246811221:1:*', '1.759595', '1.0961283333333'); 
+1

你得到什麼錯誤? 你想用新的條目或與以前相同的數據更新它? – 6339

+0

我沒有收到任何錯誤。即使imei號碼相同,它也只是添加一個新行,這不是我想要在這裏做的。我想更新新的條目(緯度,經度)可以改變,它會更新行,如果imei號碼存在。如果它是一個新的imei,它會插入一個新的行。 – hhs

+2

@ hhs。 。 。那麼即使你認爲你做了,你也沒有對'imei'的唯一索引/限制。或者,新值與表中的值(拖尾空格,未看到的字符或類似內容)略有不同。 –

回答

2

可以看出here,你需要要麼A到替換更新語句的實際值|引用到alreay現有值(例如longitude=longitude)或乙|引用到新的值(例如longitude=VALUES(longitude),但不longitude='$lonhex1')。

您的查詢應該被改寫:

$qprep = ("INSERT INTO gpsdata (`imei`,`latitude`,`longitude`) 
VALUES ('$imei','$lathex1','$lonhex1') ON DUPLICATE KEY UPDATE 
latitude=VALUES(latitude),longitude=VALUES(longitude)"); 
0

你要通過在其上使用了要在其上的重複鍵更新的主鍵或唯一鍵的列名和它的值。

如果它獲得數據庫(在其唯一性主鍵定義你的情況ROW,緯度和經度列)的ID,它更新它,否則它插入一個新行。

$qprep = ("INSERT INTO gpsdata (`imei`,`latitude`,`longitude`) 
VALUES ('$imei','$lathex1','$lonhex1') ON DUPLICATE KEY UPDATE 
latitude=VALUES(latitude),longitude=VALUES(longitude)"); 

例子:

INSERT INTO gpsdata (`row`,`imei`,`latitude`,`longitude`) 
VALUES ('24','1','TEST','TEST') ON DUPLICATE KEY UPDATE 
`IMEI`='2', `Latitude`='2',`Longitude`='2'; 

or 

INSERT INTO gpsdata (`imei`,`latitude`,`longitude`) 
VALUES ('1','TEST','TEST') ON DUPLICATE KEY UPDATE 
`IMEI`='2', `Latitude`=VALUES(`Latitude`),`Longitude`=VALUES(`Longitude); 
+0

有點補充:它不限於在主鍵列上檢測重複項,而是在添加唯一約束的任何列上。由於主鍵是唯一鍵的特殊情況,因此該語句成立。 – klaar

+0

@klaar謝謝,我錯過了.. – Mukesh

0

如果您在此服務器上運行的基於語句複製,然後會出現一個問題,請參見下面的警告:

Unsafe statement written TO the BINARY LOG USING statement FORMAT 
since BINLOG_FORMAT = STATEMENT. INSERT... ON DUPLICATE KEY UPDATE 
ON a TABLE WITH more THAN ONE UNIQUE KEY IS unsafe