当前位置: 首页 > news >正文

针对 MySQL 数据库中 主键/唯一约束的更新方法 和 ON DUPLICATE KEY UPDATE 语法的详细说明及示例,并以表格总结

以下是针对 MySQL 数据库中 主键/唯一约束的更新方法ON DUPLICATE KEY UPDATE 语法的详细说明及示例,并以表格总结:


一、主键的更新

1. 更新主键的条件
  • 允许更新:MySQL 允许更新主键列,但需满足以下条件:
    1. 唯一性:新值在表中必须唯一且非空。
    2. 外键关联:若其他表通过外键引用该主键,需先更新关联表的外键值。
示例代码
-- 创建用户表(主键 user_id)
CREATE TABLE users (
    user_id INT PRIMARY KEY,
    name VARCHAR(50)
);

-- 创建订单表(外键关联 user_id)
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    user_id INT,
    FOREIGN KEY (user_id) REFERENCES users(user_id)
);

-- 插入数据
INSERT INTO users (user_id, name) VALUES (1, 'Alice');
INSERT INTO orders (order_id, user_id) VALUES (1001, 1);

-- 更新主键 user_id(需同步更新外键关联表)
UPDATE orders SET user_id = 2 WHERE user_id = 1;
UPDATE users SET user_id = 2 WHERE user_id = 1;
注意事项
  • 外键同步:必须先更新关联表的外键值,否则会报错 Foreign key constraint fails
  • 性能影响:频繁更新主键可能导致聚簇索引重建,影响性能。

二、唯一约束的更新

1. 更新唯一约束列
  • 允许更新:唯一约束列的值可以更新,但需确保新值唯一且符合非空约束。
示例代码
-- 创建表并添加唯一约束(email 列)
CREATE TABLE emails (
    email VARCHAR(100) UNIQUE,
    user_id INT
);

-- 插入数据
INSERT INTO emails (email, user_id) VALUES ('alice@example.com', 1);

-- 更新唯一列(确保新值唯一)
UPDATE emails SET email = 'bob@example.com' WHERE user_id = 1;

-- 错误示例:新值重复
UPDATE emails SET email = 'alice@example.com' WHERE user_id = 1;
-- 报错:Duplicate entry 'alice@example.com' for key 'email'
注意事项
  • 唯一性检查:更新前需确保新值在表中不存在。
  • 业务逻辑:唯一列通常用于业务标识(如邮箱),更新需谨慎。

三、ON DUPLICATE KEY UPDATE 语法详解

1. 语法结构
INSERT INTO table (col1, col2, ...)
VALUES (val1, val2, ...)
ON DUPLICATE KEY UPDATE
    col1 = expr1,
    col2 = expr2,
    ...;
  • 触发条件:当插入的值与主键或唯一约束列冲突时触发更新。
  • 关键函数
    • VALUES(col):获取插入语句中的对应值。
    • 可组合表达式(如 col = col + 1)。
示例代码
-- 创建表(主键 user_id,唯一约束 email)
CREATE TABLE users (
    user_id INT PRIMARY KEY,
    email VARCHAR(100) UNIQUE,
    name VARCHAR(50),
    login_count INT
);

-- 插入新用户
INSERT INTO users (user_id, email, name, login_count)
VALUES (1, 'alice@example.com', 'Alice', 1);

-- 再次插入相同 user_id(触发更新)
INSERT INTO users (user_id, email, name, login_count)
VALUES (1, 'alice@example.com', 'Alice Smith', 2)
ON DUPLICATE KEY UPDATE
    name = VALUES(name),          -- 使用新插入的 name 值
    login_count = login_count + 1;-- 自增登录计数

-- 结果:user_id=1 的 name 变为 'Alice Smith',login_count 变为 2(原值 1 + 1)
注意事项
  • 适用场景:批量插入或更新(如计数器累加)。
  • 性能:适合少量数据操作,大数据量建议使用 LOAD DATA 或事务。

四、总结表格

操作类型描述示例代码片段注意事项
主键更新允许更新,需同步关联表的外键值。UPDATE orders SET user_id = 2 WHERE user_id = 1;1. 必须先更新外键关联表;
2. 频繁更新影响性能。
唯一约束更新新值必须唯一且非空。UPDATE emails SET email = 'bob@example.com' WHERE user_id = 1;确保新值在表中不存在。
ON DUPLICATE KEY UPDATE插入时冲突则更新,支持 VALUES() 和表达式。ON DUPLICATE KEY UPDATE name = VALUES(name), login_count = login_count +1;1. 适用于插入或更新混合场景;
2. 可结合表达式实现复杂逻辑(如计数器累加)。

关键注意事项

  1. 主键更新
    • 必须先更新关联表的外键字段。
    • 频繁更新可能导致索引重建,建议设计时选择稳定的主键(如自增 ID)。
  2. 唯一约束更新
    • 新值必须唯一且符合非空约束。
  3. ON DUPLICATE KEY UPDATE
    • 适用于单条插入或更新,大数据量需结合事务或批量操作。
    • 可通过 VALUES() 获取插入的值,或直接使用表达式(如 col = col + 1)。

通过上述方法,可高效管理主键和唯一约束的更新,同时避免数据不一致或性能问题。

http://www.dtcms.com/a/108485.html

相关文章:

  • YOLOv11区域检测
  • Element Plus 常用组件
  • 超越人工智能驱动的网络攻击:现代防御者的策略
  • 电子电气架构 --- 智能座舱域控设计
  • Flutter 音视频播放器与弹幕系统开发实践
  • RK3588使用笔记:USB转232、485、422模块驱动适配
  • [蓝桥杯 2024 省 A] 训练士兵
  • 虚拟试衣间-云尚衣橱小程序-衣橱管理实现
  • 算法:二进制求和
  • 从零构建大语言模型全栈开发指南:第四部分:工程实践与部署-4.3.3低代码开发:快速构建行业应用(电商推荐与金融风控案例)
  • Python 驱动周立功200U收发报文
  • 国产系统服务器识别不到SATA盘
  • STM32学习笔记之RCC模块(实操篇)
  • 横扫SQL面试——中位数问题
  • git tag
  • Linux 中CIFS和NFS使用说明
  • MCP学习总结
  • 基于RapidIO接口的DSP+GPU工业AI实时计算解决方案
  • ‘conda‘ 不是内部或外部命令,也不是可运行的程序或批处理文件
  • 【YOLOv8】YOLOv8改进系列(12)----替换主干网络之StarNet
  • 系统安全——文件监控-FileMonitor
  • 数据在内存中存储(C语言)
  • 杂篇-行业分类一二-2(通、专用设备制造,汽车制造)
  • (done) MIT6.824 Lecture 02 - RPC and Threads
  • stm32:sg90 和 mg90s舵机学习
  • Python----计算机视觉处理(Opencv:道路检测之提取车道线)
  • 好玩有趣的github开源项目分享(持续更新)
  • 【MySQL基础】 JSON函数入门
  • 代码随想录-动态规划18
  • 如何学习C++以及C++的宏观认知