INSERT如果不存在则UPDATE如果存在不起作用

时间:2015-10-20 11:56:52

标签: php mysql insert-update

我正在努力获得众所周知的 INSERT的解决方案,如果没有EXISTS UPDATE IF EXISTS

但我的不行。我不知道为什么,有人能想出来吗?

以下是我的尝试:

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

如果相同的" imei "我想要更新该行在那里,或插入,如果不是。 我将 ROW 作为主键,并且从 phpmyadmin ,我已经制作了imei" unique "。

我做错了什么?

My 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');

3 个答案:

答案 0 :(得分:2)

here所示,您需要使用 A | 对alreay现有值(例如longitude=longitude)或 B | 引用新值(例如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)");

答案 1 :(得分:0)

您必须传递列名及其使用了您希望重复密钥更新的主键或唯一键的值。

如果它获得了数据库中的id(在你的情况下是ROW,纬度和经度列,其中定义了主键和唯一键),它会更新它,否则它会插入一个新行。

$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);

答案 2 :(得分: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