2015-10-20 97 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