REPLACE的运行与INSERT很相像。只有一点除外,如果表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。请参见13.2.4节,“INSERT语法”。
注意,除非表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。
所有列的值均取自在REPLACE语句中被指定的值。所有缺失的列被设置为各自的默认值,这和INSERT一样。您不能从当前行中引用值,也不能在新行中使用值。如果您使用一个例如“SET col_name = col_name + 1”的赋值,则对位于右侧的列名称的引用会被作为DEFAULT(col_name)处理。因此,该赋值相当于SET col_name = DEFAULT(col_name) + 1。
使用REPLACE into,必须同时拥有表的INSERT和DELETE权限。
REPLACE语句会返回一个数,来指示受影响的行的数目。该数是被删除和被插入的行数的和。如果对于一个单行REPLACE该数为1,则一行被插入,同时没有行被删除。如果该数大于1,则在新行被插入前,有一个或多个旧行被删除。如果表包含多个唯一索引,并且新行复制了在不同的唯一索引中的不同旧行的值,则有可能是一个单一行替换了多个旧行。
受影响的行数可以容易地确定是否REPLACE只添加了一行,或者是否REPLACE也替换了其它行:检查该数是否为1(添加)或更大(替换)。
如果您正在使用C API,则可以使用mysql_affected_rows()函数获得受影响的行数。
目前,您不能在一个子查询中,向一个表中更换,同时从同一个表中选择。
以下是所用算法的更详细的说明(该算法也用于LOAD DATA…REPLACE):
1. 尝试把新行插入到表中
2. 当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时:
a. 从表中删除含有重复关键字值的冲突行
b. 再次尝试把新行插入到表中
举例:
CREATE TABLE `test`.`n` (
`id` int(10) unsigned NOT NULL auto_increment,
`time` varchar(45) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM
replace into n (id,time) values(1,now());
SELECT * FROM n ;
测试可见,有primary-key的情况下,使用replace into 不会造成id increment持续增长。
1, '2011-09-23 12:52:50'
2, '2011-09-23 12:46:34'
10, '2011-09-23 12:46:46'
总结:使用replace into 时,必须考虑包含主键的情况下操作,从而不会造成主键持续增长!
分享到:
相关推荐
根据提供的文件信息,本文将详细解释 MySQL 中 `REPLACE INTO` 的使用方法及特性,并对比其与 `INSERT INTO` 的不同之处。 ### MySQL REPLACE INTO 介绍 #### 1. REPLACE INTO 的基本概念 `REPLACE INTO` 是 ...
在编程接口(如 C API)中,你可以使用 `mysql_affected_rows()` 函数来获取受影响的行数,以判断 `REPLACE INTO` 是否只添加了一行还是同时替换了其他行。 `REPLACE INTO` 的语法格式如下: ```sql REPLACE [LOW_...
MySQL中的`REPLACE INTO`语句是一个非常实用的数据库操作,它在特定场景下能替代`INSERT`和`UPDATE`的组合使用。本篇文章将深入浅出地解析`REPLACE INTO`的原理、使用方法以及适用场景,并通过实例来演示其工作方式...
MySQL中的`REPLACE INTO`语句是一个非常有用的命令,它的工作方式类似于`INSERT`,但带有一种自动删除和替换的功能。当试图插入的数据与表中已存在的唯一索引(包括 PRIMARY KEY 或 UNIQUE 索引)冲突时,`REPLACE ...
在 SQL Server 中可以这样处理: 代码如下: if not exists (select 1 from t where id = 1) ...MySQL 中有更简单的方法: replace into 代码如下: replace into t(id, update_time) values(1, now());或 repl
MySQL中的`REPLACE`和`REPLACE INTO`是两种用于数据插入或更新的SQL语句,它们在处理数据冲突时有独特的策略。首先,我们来分别解析这两个命令。 `REPLACE`函数通常指的是字符串处理函数,它在MySQL中用于替换字符...
公司开发人员在更新数据时使用了 replace into 语句,由于使用不当导致了数据的大量丢失,到底是如何导致的数据丢失本文对此进行分析。 一、问题说明 公司开发人员在更新数据时使用了 replace into 语句,由于使用...
replace into语句会根据唯一键/主键删除原有的一条记录, 并且插入一条新的记录来替换原记录。如果没有表不存在唯一键/主键 或者 插入的数据唯一键/主键没有重复的,那么会新增一条记录。 新建一个test表,三个字段...
MySQL中的`REPLACE INTO`和`INSERT INTO ... ON DUPLICATE KEY UPDATE`是两种处理数据冲突的方法,它们在处理已有键值冲突时的行为有所不同。这两种语句都是在插入新记录时,如果发现存在相同的唯一键值,则采取不同...
在MySQL数据库中,`REPLACE INTO` 和 `INSERT INTO` 是两种不同的数据插入语句,它们各有其特定的用途和行为。理解它们的区别对于优化数据库操作至关重要。 首先,`INSERT INTO` 是最基本的数据插入语句,它用于在...
深入理解这些机制对于解决高级MySQL问题至关重要。 首先,我们需要了解事务隔离级别对INSERT并发执行的影响。MySQL支持四种事务隔离级别:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ(RR)和SERIALIZABLE...
[mysql]replace的用法(替换某字段部分内容) [mysql]replace的用法 1.replace into replace into table (id,name) values(‘1′,’aa’),(‘2′,’bb’) 此语句的作用是向表table中插入两条记录。如果主键id为...
MySQL中的`REPLACE INTO`语句是一个非常实用的命令,它结合了`INSERT`和`UPDATE`的功能,简化了在数据库表中处理已有数据的工作流程。这个语句主要用于当你要插入一条新记录,但该记录的主键或唯一索引字段与现有...
总的来说,`REPLACE INTO`是MySQL中处理数据插入和更新的一个强大工具,但使用时需谨慎,因为它会彻底删除已存在的行。正确理解和使用`REPLACE INTO`能帮助你在数据库管理中避免数据冗余和不一致,提高数据的整洁性...
本章内容通过一个例子说明 replace into 带来的潜在的数据质量风险,当涉及replace into操作的表含有自增主键时,主备切换后会造成数据覆盖等不一致的情况发生。 二 案例分析 在主库上操作 代码如下: root@test 12:36...