mySQL如何更新和替换

时间:2010-06-20 13:49:12

标签: mysql

我需要插入记录,但如果记录存在则执行替换。以下是我目前使用的内容:

  $sessionDate = date("Y-m-d H:i:s");
  foreach($tmpVP as $sessionVP) {
    $res = mysql_query("INSERT INTO sessions
                      (sessionID,sessionDate,sessionVS,sessionVP)
                      VALUES('$sessionID','$sessionDate','$sessionVS',
                      '$sessionVP')") ;
  }

我真正需要的是更新与sessionIDsessionVSsessionVP匹配的所有记录,并插入不匹配的新记录。

修改

表格定义

CREATE TABLE `sessions` (
 `ID` bigint(20) NOT NULL auto_increment,
 `sessionID` varchar(36) NOT NULL,
 `sessionDate` datetime NOT NULL,
 `sessionUser` bigint(20) NOT NULL,
 `sessionVS` varchar(255) NOT NULL,
 `sessionVP` bigint(20) NOT NULL,
 `reserved` int(11) NOT NULL,
 PRIMARY KEY  (`ID`),
 KEY `ID` (`ID`)
) ENGINE=MyISAM AUTO_INCREMENT=88 DEFAULT CHARSET=utf8

sessionID,sessionVP和sessionVS不是唯一的。样品:

sessionID                  sessionDate          sessionUser sessionVS sessionVP 
0t1m58q9ktejuhqlrjqglcoia0 2010-06-20 09:20:53  0           111111    144268736
0t1m58q9ktejuhqlrjqglcoia0 2010-06-20 09:20:53  0           111111    144268819
0t1m58q9ktejuhqlrjqglcoia0 2010-06-20 09:20:53  0           111111    144268880

所以,如果我有0t1m58q9ktejuhqlrjqglcoia0111111和'144268880'的新记录,我需要更新第3行而不是添加第4行。

5 个答案:

答案 0 :(得分:5)

首先,您应该在(sessionID, sessionVP, sessionVS)上添加唯一索引。您可以使用以下命令执行此操作:

CREATE UNIQUE INDEX ux_sessions_sessionid_sessionvs_sessionvp
ON sessions (sessionID, sessionVS, sessionVP)

然后在MySQL中插入或更新有两种相对简单的方法。第一种是使用ON DUPLICATE UPDATE

INSERT INTO sessions
(sessionID,sessionDate,sessionVS,sessionVP)
VALUES
('$sessionID', '$sessionDate', '$sessionVS', '$sessionVP')
ON DUPLICATE KEY UPDATE sessionDate = '$sessionDate'

还有其他方法是使用REPLACE

REPLACE INTO sessions
(sessionID,sessionDate,sessionVS,sessionVP)
VALUES
('$sessionID', '$sessionDate', '$sessionVS', '$sessionVP')

第二个稍微简洁一点,但缺点是它在内部导致删除后跟插入。

还有一些其他问题:

  • ID上不需要主键索引和普通索引。删除普通索引,因为它是多余的。

  • 您可能有SQL漏洞。如果您尚未验证输入,则可能需要考虑使用mysql_real_escape_stringintval来保护自己。或者,您可以查看使用查询参数。

  • 您没有检查错误情况。考虑使用trigger_error,以便在查询出错时可以看到错误。查看错误消息可以节省大量的调试时间。

    mysql_query("...") or trigger_error(mysql_error());
    

答案 1 :(得分:4)

您可以查看INSERT ... ON DUPLICATE KEY UPDATEhttp://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

答案 2 :(得分:1)

(sessionID, sessionVS, sessionVP)上添加唯一键,然后使用REPLACE代替INSERT(只需替换单词,语法相同)。

答案 3 :(得分:0)

根据您的表格结构,我指的是您可以使用的主键

$res = mysql_query("REPLACE INTO sessions
                      (sessionID,sessionDate,sessionVS,sessionVP)
                      VALUES('$sessionID','$sessionDate','$sessionVS',
                      '$sessionVP')") ;

答案 4 :(得分:0)

值是否是主键的一部分?如果是,请查看:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html