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';