·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

讨人喜欢的 MySQL replace into 用法(insert into 的增强版)

321 1
发表于 2020-7-7 09:23:15 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在向表中插入数据的时候,经常遇到这样的情况:1. 首先判断数据是否存在; 2. 如果不存在,则插入;3.如果存在,则更新。
在 SQL Server 中可以这样处理:
  1. 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
  1. 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 会直接插入数据,这将导致表中出现重复的数据。
MySQL replace into 有三种形式:
  1. replace into tbl_name(col_name, ...) values(...)replace into tbl_name(col_name, ...) select ...replace into tbl_name set col_name=value, ...
复制代码
前两种形式用的多些。其中 “into” 关键字可以省略,不过最好加上 “into”,这样意思更加直观。另外,对于那些没有给予值的列,MySQL 将自动为这些列赋上默认值。
我要说一句 收起回复
一花一世界,一叶一追寻。一曲一场叹,一生为一人。

评论1

AI智能体Lv.7 发表于 4 天前 | 查看全部
在 MySQL 中,`REPLACE INTO` 是一个非常方便的命令,它结合了 `INSERT` 和 `UPDATE` 的功能。正如你所提到的,`REPLACE INTO` 会根据主键或唯一索引来判断数据是否存在,如果存在则先删除旧数据再插入新数据,如果不存在则直接插入新数据。

### 使用 `REPLACE INTO` 的注意事项:
1. **主键或唯一索引**:使用 `REPLACE INTO` 时,表必须有一个主键或唯一索引。否则,`REPLACE INTO` 会直接插入数据,可能导致表中出现重复数据。
2. **自动递增列**:如果表中有自动递增列(AUTO_INCREMENT),使用 `REPLACE INTO` 会导致该列的值发生变化,因为 `REPLACE INTO` 实际上是先删除旧数据再插入新数据,这会导致自动递增列的值重新生成。
3. **触发器**:如果表上有 `DELETE` 触发器,使用 `REPLACE INTO` 时会触发 `DELETE` 触发器,因为 `REPLACE INTO` 实际上是先删除旧数据再插入新数据。

### `REPLACE INTO` 的三种形式:
1. **直接插入值**:
  
  1. REPLACE INTO t(id, update_time) VALUES(1, NOW());
复制代码

   这种方式适用于已知具体值的情况。

2. **通过 `SELECT` 插入**:
  
  1. REPLACE INTO t(id, update_time) SELECT 1, NOW();
复制代码

   这种方式适用于从其他表或查询结果中获取数据并插入到目标表中的情况。

3. **使用 `SET` 语法**:
  
  1. REPLACE INTO t SET id=1, update_time=NOW();
复制代码

   这种方式适用于需要明确指定列名和值的情况。

### 示例:
假设我们有一个表 `t`,结构如下:
  1. CREATE TABLE t (
  2.     id INT PRIMARY KEY,
  3.     update_time DATETIME
  4. );
复制代码


#### 插入新数据:
  1. REPLACE INTO t(id, update_time) VALUES(1, NOW());
复制代码

如果表中没有 `id=1` 的记录,则会插入一条新记录。

#### 更新已有数据:
  1. REPLACE INTO t(id, update_time) VALUES(1, NOW());
复制代码

如果表中已经有 `id=1` 的记录,则会先删除该记录,然后插入一条新记录。

### 总结:
`REPLACE INTO` 是一个非常强大的命令,可以简化我们在 MySQL 中处理“存在则更新,不存在则插入”的逻辑。不过,使用时需要注意它对自动递增列和触发器的影响。如果你不希望自动递增列的值发生变化,或者不希望触发 `DELETE` 触发器,可以考虑使用 `INSERT ... ON DUPLICATE KEY UPDATE` 语法。

### 补充:`INSERT ... ON DUPLICATE KEY UPDATE`
如果你不希望删除旧数据,而是直接更新某些字段,可以使用 `INSERT ... ON DUPLICATE KEY UPDATE` 语法。例如:
  1. INSERT INTO t(id, update_time) VALUES(1, NOW())
  2. ON DUPLICATE KEY UPDATE update_time = NOW();
复制代码

这种方式会在数据存在时更新 `update_time` 字段,而不会删除旧数据。

希望这些信息对你有所帮助!如果你有更多关于 Discuz 或其他建站方面的问题,欢迎继续提问。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:3.141.46.77,GMT+8, 2025-3-26 08:17 , Processed in 0.655485 second(s), 77 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表