Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mySQL如何更新和替换_Mysql - Fatal编程技术网

mySQL如何更新和替换

mySQL如何更新和替换,mysql,Mysql,我需要插入记录,但如果记录存在,请替换。以下是我目前正在使用的内容: $sessionDate = date("Y-m-d H:i:s"); foreach($tmpVP as $sessionVP) { $res = mysql_query("INSERT INTO sessions (sessionID,sessionDate,sessionVS,sessionVP) VALUES('$s

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

  $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
的记录,并插入不匹配的新记录

编辑:

表定义

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

因此,如果我有一个新记录,其中包含
0t1m58q9ktejuhqlrjqglcoia0
111111
,以及'144268880',我需要更新第3行,而不是添加第4行。

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

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

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

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

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

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

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

CREATE UNIQUE INDEX ux_sessions_sessionid_sessionvs_sessionvp
ON sessions (sessionID, sessionVS, sessionVP)
在MySQL中插入或更新有两种相对简单的方法,第一种是使用:

还有其他方法可以使用:

第二种方法略为简洁,但缺点是它在内部导致先删除后插入

还有一些其他问题:

  • 您不需要在
    ID
    上同时使用主键索引和普通索引。请删除普通索引,因为它是多余的

  • >p>您可能有SQL漏洞。如果您还没有验证输入,您可能需要考虑使用或适当地保护自己。或者,您可以查看使用查询参数。

    >p>您没有检查错误情况。请考虑使用,这样如果您的查询有错误,您可以看到错误是什么。查看错误消息可以节省大量的调试时间。

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

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

CREATE UNIQUE INDEX ux_sessions_sessionid_sessionvs_sessionvp
ON sessions (sessionID, sessionVS, sessionVP)
在MySQL中插入或更新有两种相对简单的方法,第一种是使用:

还有其他方法可以使用:

第二种方法略为简洁,但缺点是它在内部导致先删除后插入

还有一些其他问题:

  • 您不需要在
    ID
    上同时使用主键索引和普通索引。请删除普通索引,因为它是多余的

  • >p>您可能有SQL漏洞。如果您还没有验证输入,您可能需要考虑使用或适当地保护自己。或者,您可以查看使用查询参数。

    >p>您没有检查错误情况。请考虑使用,这样如果您的查询有错误,您可以看到错误是什么。查看错误消息可以节省大量的调试时间。

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

您可以查看
INSERT…ON DUPLICATE KEY UPDATE

您可以查看
INSERT…ON DUPLICATE KEY UPDATE

值是主键的一部分吗?如果是,请查看:

值是主键的一部分吗?如果是,请查看:

另一个比较
在使用Oracle的
MERGE
进行重复键更新时:另一个比较重复键更新时
与Oracle的
MERGE
的有用页面:正如Mark Byers建议的那样,请使用
mysql\u real\u escape\u字符串检查经过消毒的输入,请发布表定义。
显示创建表会话作为标记拜尔斯建议,使用例如
mysql\u real\u escape\u string
检查经过消毒的输入,请发布您的表定义。
SHOW CREATE table sessions
您可能希望包括REPLACE的规定(它在“更新”时删除记录并插入新记录)感谢添加的提示。我的代码中有这些提示,只是我的示例中没有包含这些提示。您可能希望包含替换的规定(在“更新”时删除记录并插入新记录)。感谢添加的提示。我的代码中有这些提示,只是我的示例中没有包含这些提示。