Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.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
Php MySql:如果值存在,更新else INSERT_Php_Mysql - Fatal编程技术网

Php MySql:如果值存在,更新else INSERT

Php MySql:如果值存在,更新else INSERT,php,mysql,Php,Mysql,我有一些代码看起来像这样。表中还有一个我必须保留的自动增量字段(它在其他表中使用)。我想简化和优化这段代码 $query ="SELECT * FROM models WHERE col1 = 'foo'"; $testResult = mysql_query($query) or die('Error, query failed'); if(mysql_fetch_array($testResult) == NULL){ //insert... $query ="IN

我有一些代码看起来像这样。表中还有一个我必须保留的自动增量字段(它在其他表中使用)。我想简化和优化这段代码

$query ="SELECT * FROM models WHERE col1 = 'foo'";
$testResult = mysql_query($query) or die('Error, query failed');    

if(mysql_fetch_array($testResult) == NULL){
    //insert...
    $query ="INSERT INTO models (col1, col2, col3)
    VALUES ('foo', 'bar', 'alph')";
    $result = mysql_query($query) or die('Error, query failed');
}else{
    //update...
    $query = "UPDATE models
        SET col1='foo', col2='bar', col3='alph'
        WHERE col1='foo' AND col2='bar'";
        $result = mysql_query($query) or die('Error, query failed');        
}
编辑:主键id是自动递增的字段。我永远不想改变这个。但是,当另一个字段被复制时,这就是我要更新该记录的时间。

您可以尝试使用“插入…复制密钥更新”语法


对于MySQL 5.0+使用:
INSERT ON DUPLICATE KEY UPDATE


替换为:

REPLACE INTO models
( col1, col2, col3 )
VALUES
( 'foo', 'bar', 'alpha' )

假设col1是主键,如果值为“foo”的行已经存在,它将更新其他两列。否则它将插入新行。

您只需在重复时更新col3即可。这正是你想要的

INSERT INTO models (col1, col2, col3)
VALUES ('foo', 'bar', 'alpha')
ON DUPLICATE KEY UPDATE col3='alpha';

检查:你所说的“自动递增字段”是什么意思?这个问题可能会有帮助。。。
replace
的问题在于它假定条目存在。但是用户想要插入或更新——两者都是。它的名称不好。它不假定条目存在。从MySQL文档中可以看出:“REPLACE的工作原理与INSERT完全相同,只是如果表中的一个旧行对于主键或唯一索引具有与新行相同的值,那么在插入新行之前,旧行会被删除。”我不知道这一点。投票给你--我今天学到了一些新东西!我认为“替换”在某种程度上使用“删除”。我不给数据库用户DELETE访问权限,而REPLACE在这种情况下不起作用。因为MySQL 4.1可用,有没有一种方法可以做到这一点而不使用“on duplicate key”,比如说,你能做一些类似“on duplicate column”的事情吗?我这样问是因为我显然是在自动递增密钥。
INSERT INTO models (col1, col2, col3)
VALUES ('foo', 'bar', 'alpha')
ON DUPLICATE KEY UPDATE col3='alpha';