mySQL如何更新和替换

use*_*688 1 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')") ;
  }
Run Code Online (Sandbox Code Playgroud)

我真正需要的是更新的任何记录匹配sessionID,sessionVSsessionVP并插入不匹配的新记录.

编辑:

表定义

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

所以,如果我有一个新的记录0t1m58q9ktejuhqlrjqglcoia0,111111和`144268880'我需要更新列#3,而不是添加行号4.

Mar*_*ers 5

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

CREATE UNIQUE INDEX ux_sessions_sessionid_sessionvs_sessionvp
ON sessions (sessionID, sessionVS, sessionVP)
Run Code Online (Sandbox Code Playgroud)

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

INSERT INTO sessions
(sessionID,sessionDate,sessionVS,sessionVP)
VALUES
('$sessionID', '$sessionDate', '$sessionVS', '$sessionVP')
ON DUPLICATE KEY UPDATE sessionDate = '$sessionDate'
Run Code Online (Sandbox Code Playgroud)

还有其他就是使用REPLACE:

REPLACE INTO sessions
(sessionID,sessionDate,sessionVS,sessionVP)
VALUES
('$sessionID', '$sessionDate', '$sessionVS', '$sessionVP')
Run Code Online (Sandbox Code Playgroud)

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

还有一些其他问题:

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

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

  • 您没有检查错误情况.考虑使用,trigger_error以便如果您的查询有错误,您可以看到错误是什么.查看错误消息可以节省大量的调试时间.

    mysql_query("...") or trigger_error(mysql_error());
    
    Run Code Online (Sandbox Code Playgroud)