在向表中插入数据的时候,经常遇到这样的情况:1. 首先判断数据是否存在; 2. 如果不存在,则插入;3.如果存在,则更新。

在 SQL Server 中可以这样处理:

if not exists (select 1 from t where id = 1) 
insert into t(id, update_time) values(1, getdate())
else
update t set update_time = getdate() where id = 1

 

那么 MySQL 中如何实现这样的逻辑呢?别着急!MySQL 中有更简单的方法:

replace into t(id, update_time) values(1, now());或
replace into t(id, update_time) select 1, now();

 

replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中, 1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。 2. 否则,直接插入新数据。

要注意的是:插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据。

replace into的三种语法形式:

REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name [(col_name,...)]
    VALUES ({expr | DEFAULT},...),(...),...
或
REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name
    SET col_name={expr | DEFAULT}, ...
或
REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name [(col_name,...)]
    SELECT ...

 

附上UCHome中看到的一个replace into的用法:

$_POST[\'config\'][\'ipaccess\'] = trim($_POST[\'config\'][\'ipaccess\']);
$_POST[\'config\'][\'ipbanned\'] = trim($_POST[\'config\'][\'ipbanned\']);

foreach ($_POST[\'config\'] as $var => $value) {
  $value = trim($value);
  if(!isset($_SCONFIG[$var]) || $_SCONFIG[$var] != $value) {
    $setarr[] = "(\'$var\', \'$value\')";
  }
}

if($setarr) {
  $_SGLOBAL[\'db\']->query("REPLACE INTO ".tname(\'config\')." (var, datavalue) VALUES ".implode(\',\', $setarr));
}

//REPLACE INTO uchome_config (var, datavalue) VALUES (\'ipaccess\', \'127.0.0.1\'),(\'ipbanned\', \'10.3.1\')

版权声明:本文为eastson原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/eastson/archive/2012/11/30/2796289.html