首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mySQL如何更新和替换

问mySQL如何更新和替换
EN

Stack Overflow用户
提问于 2010-06-20 13:49:12
回答 5查看 486关注 0票数 1

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

代码语言:javascript
复制
  $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')") ;
  }

我真正需要的是更新任何匹配sessionID、sessionVS和sessionVP的记录,并插入不匹配的新记录。

编辑:

表定义

代码语言:javascript
复制
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并不是唯一的。示例:

代码语言:javascript
复制
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

因此,如果我使用0t1m58q9ktejuhqlrjqglcoia0、111111和‘144268880’的新记录,我需要更新第3行,而不是添加第4行。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-06-20 13:51:40

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

代码语言:javascript
复制
CREATE UNIQUE INDEX ux_sessions_sessionid_sessionvs_sessionvp
ON sessions (sessionID, sessionVS, sessionVP)

然后有两种在MySQL中插入或更新的相对简单的方法。第一个是使用关于重复更新

代码语言:javascript
复制
INSERT INTO sessions
(sessionID,sessionDate,sessionVS,sessionVP)
VALUES
('$sessionID', '$sessionDate', '$sessionVS', '$sessionVP')
ON DUPLICATE KEY UPDATE sessionDate = '$sessionDate'

还有一种是使用替换

代码语言:javascript
复制
REPLACE INTO sessions
(sessionID,sessionDate,sessionVS,sessionVP)
VALUES
('$sessionID', '$sessionDate', '$sessionVS', '$sessionVP')

第二种方法略显简洁,但其缺点是在内部导致删除,然后插入。

还有其他几个问题:

  • 您不需要ID上的主键索引和普通索引。删除普通索引,因为它是多余的。
  • 您可能存在SQL漏洞。如果您还没有验证输入,您可能需要考虑通过适当使用mysql_real_escape_string或intval来保护自己。或者,您可以查看如何使用查询参数。
  • 您没有检查错误条件。考虑使用trigger_error,这样如果查询有错误,您就可以看到错误是什么。查看错误消息可以节省大量的调试时间。 Mysql_query(“.”)或trigger_error(mysql_error());
票数 5
EN

Stack Overflow用户

发布于 2010-06-20 13:51:49

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

票数 4
EN

Stack Overflow用户

发布于 2010-06-20 13:51:26

在(sessionID, sessionVS, sessionVP)上添加一个惟一的键,然后使用REPLACE而不是INSERT (只需替换单词,语法相同)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3079447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档