MySQL INSERT 语句:当记录不存在时插入

在 MySQL 中,有几种方法可以实现"当记录不存在时插入"的操作。以下是几种常用的解决方案:

使用 INSERT IGNORE

复制代码
INSERT IGNORE INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);

特点:

1.如果记录已存在(基于主键或唯一索引),则忽略插入操作

2.不会报错,但会返回警告

3.简单易用,但无法知道是插入成功还是被忽略

使用 ON DUPLICATE KEY UPDATE

复制代码
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
ON DUPLICATE KEY UPDATE column1 = VALUES(column1), column2 = VALUES(column2);

特点:

1.如果记录已存在,则执行 UPDATE 操作

2.可以指定更新哪些字段

3.返回受影响的行数(1表示插入,2表示更新)

使用 REPLACE INTO

复制代码
REPLACE INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);

特点:

1.如果记录已存在,先删除旧记录再插入新记录

2.会触发 DELETE 和 INSERT 两个操作

3.自增ID会改变(不推荐需要保持ID不变的场景)

使用 NOT EXISTS 子查询

复制代码
INSERT INTO table_name (column1, column2, ...)
SELECT value1, value2, ...
FROM dual
WHERE NOT EXISTS (
    SELECT 1 FROM table_name 
    WHERE unique_column = unique_value
);

特点:

1.更灵活的判断条件

2.可以基于非唯一键判断

3.语法稍复杂

示例对比

假设有一个用户表 users,主键为 id,username 有唯一约束:

复制代码
-- 方法1: INSERT IGNORE
INSERT IGNORE INTO users (username, email) VALUES ('john', '[email protected]');

-- 方法2: ON DUPLICATE KEY UPDATE
INSERT INTO users (username, email) VALUES ('john', '[email protected]')
ON DUPLICATE KEY UPDATE email = VALUES(email);

-- 方法3: REPLACE INTO
REPLACE INTO users (username, email) VALUES ('john', '[email protected]');

-- 方法4: NOT EXISTS
INSERT INTO users (username, email)
SELECT 'john', '[email protected]'
FROM dual
WHERE NOT EXISTS (
    SELECT 1 FROM users WHERE username = 'john'
);

实践建议

  1. 如果只是避免重复插入,使用 INSERT IGNORE
  2. 如果需要更新已有记录,使用 ON DUPLICATE KEY UPDATE
  3. 除非特殊需求,避免使用 REPLACE INTO(因为它会先删除记录)
  4. 复杂条件判断时使用 NOT EXISTS 方法 注意:这些方法都依赖于表上的主键或唯一约束才能正常工作。
相关推荐
ONETHING_CLOUD_225 分钟前
设备存储空间不足怎么办?
数据库·电脑·备份·数据存储·网盘·存储空间·数码知识
王者鳜錸31 分钟前
2024从Maven-MySQL-Nginx部署
mysql·nginx·maven
用户62799471826234 分钟前
南大通用GBase 8a gn层物理存储结构介绍
数据库
用户6279947182621 小时前
关于南大通用GBase 8s的DML触发器的讨论
数据库
落霞的思绪1 小时前
NoSql文档型数据库——Mongodb
数据库·mongodb·nosql
写bug写bug1 小时前
为什么 LIMIT 0, 10 快,而 LIMIT 1000000, 10 慢?
数据库·后端·mysql
用户6279947182621 小时前
1小时掌握南大通用GBase 8c Hint核心技巧!让SQL从10秒到1秒
数据库
再路上12162 小时前
direct_visual_lidar_calibration iridescence库问题
java·服务器·数据库
卡皮巴拉爱吃小蛋糕3 小时前
MySQL的事务(Transaction)【学习笔记】
数据库·笔记·学习·mysql