mysql executeupdate MySQL 系列:第4篇 增删改有章法(DML)

mysql executeupdate MySQL 系列:第4篇 增删改有章法(DML)

IT策士 10余年一线大厂经验,专注 IT 思维、架构、职场进阶。我会在各个平台持续发布最新文章mysql executeupdate,助你少走弯路。

前面的文章我们学会了建库、建表、选类型,相当于盖好了房子、规划了房间。今天终于要往里面“放家具”和“挪家具”了——这就是 DML(Data )mysql executeupdate MySQL 系列:第4篇 增删改有章法(DML),包含 、、 三大操作。别小看这三板斧,用不好轻则数据错乱,重则误删全表。我们将用 逐一拆解,并给出生产环境下的安全准则与性能优化技巧。

1. :把数据塞进去1.1 单行插入,最基础的姿势

import mysql.connector
conn = mysql.connector.connect(
    host="127.0.0.1", port=3306,
    user="root", password="MyNewPass123!",
    database="shop"
)
cursor = conn.cursor()
# 先准备好一张产品表(复用第3篇的结构)
cursor.execute("""
CREATE TABLE IF NOT EXISTS products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(200) NOT NULL UNIQUE,
    price DECIMAL(10,2) NOT NULL,
    stock INT DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB
""")
# 单行插入
sql = "INSERT INTO products (title, price, stock) VALUES (%s, %s, %s)"
cursor.execute(sql, ("Python 入门书", 59.90, 100))
conn.commit()
print(f" 插入成功,新 ID = {cursor.lastrowid}")

预期输出:

要点:

1.2 批量插入:效率提升百倍

如果要插入 1000 条数据mysql executeupdate MySQL 系列:第4篇 增删改有章法(DML),单条循环插入会产生 1000 次网络往返。用 一次性提交:

books = [
    ("Python 高级编程", 79.00, 50),
    ("MySQL 实战", 69.00, 80),
    ("Redis 深度历险", 49.00, 120),
    ("Linux 私房菜", 89.00, 30),
]
sql = "INSERT INTO products (title, price, stock) VALUES (%s, %s, %s)"
cursor.executemany(sql, books)
conn.commit()
print(f" 批量插入 {cursor.rowcount} 条记录")

预期输出:

性能对比实验(不妨动手试试):

用 time 模块计时,插入 10000 条数据,单条循环 vs 的耗时可能相差几十倍。这就是批量操作的威力。

1.3 存在即更新:ON KEY

当唯一键冲突时,我们不想报错,而是希望更新某些字段。例如同一本书再次入库时,累加库存:

sql = """
INSERT INTO products (title, price, stock)
VALUES (%s, %s, %s)
ON DUPLICATE KEY UPDATE stock = stock + VALUES(stock)
"""
cursor.execute(sql, ("Python 入门书", 59.90, 50))
conn.commit()
print(f" 库存已累加,受影响行数: {cursor.rowcount}")

预期输出:

注意:如果冲突发生且执行了更新, 返回 2;如果是全新插入返回 1。可据此判断操作类型。

1.4 :冲突时静默跳过

INTO … 遇到主键或唯一键冲突时直接忽略,不报错也不更新。

cursor.execute("INSERT IGNORE INTO products (title, price, stock) VALUES (%s, %s, %s)",
               ("Python 入门书", 59.90, 10))
conn.commit()
print(f"受影响行数: {cursor.rowcount}")  # 0,因为已存在

2. :修改已有数据2.1 基础语法与 示例

UPDATE 表名 SET 列1=值1, 列2=值2 WHERE 条件;

无 WHERE 的 会修改全表! 这是生产事故的高发区。来看一个安全示例:

# 将 id=1 的商品价格上调 10%
cursor.execute("UPDATE products SET price = price * 1.1 WHERE id = %s", (1,))
conn.commit()
print(f" 更新了 {cursor.rowcount} 行")

2.2 安全准则:先查后改

在大批量更新前,最好先用相同 WHERE 条件执行 ,确认受影响的行数:

# 安全三步走:查看 → 确认 → 更新
cursor.execute("SELECT COUNT(*) FROM products WHERE stock < 10")
count = cursor.fetchone()[0]
print(f"️ 即将清空 {count} 件低库存商品的库存,是否继续?")
# 实际生产中这里应该有确认逻辑
if count < 100:
    cursor.execute("UPDATE products SET stock = 0 WHERE stock < 10")
    conn.commit()
    print(f" 已将 {cursor.rowcount} 件商品库存置 0")

2.3 利用 LIMIT 防止误更新大量数据

UPDATE products SET stock = 0 WHERE stock < 10 LIMIT 10;

分批更新mysql executeupdate,每次只影响少量行,降低事故爆炸半径。

3. :删数据是件严肃的事3.1 基础

同样,无 WHERE 会清空整个表。建议开启 MySQL 的 –safe- 模式(或设置 =1),在没带 WHERE 或 LIMIT 时拒绝执行。

# 删除 id=5 的记录
cursor.execute("DELETE FROM products WHERE id = %s", (5,))
conn.commit()
print(f" 删除了 {cursor.rowcount} 行")

3.2 软删除 vs 硬删除

生产环境很少物理删除数据,通常采用软删除:增加 字段,标记为 1。

ALTER TABLE products ADD COLUMN is_deleted TINYINT DEFAULT 0;

删除操作变为:

cursor.execute("UPDATE products SET is_deleted = 1 WHERE id = %s", (3,))
conn.commit()

所有查询后面追加 WHERE = 0,数据可恢复,符合审计要求。

3.3 :快速清空表

TABLE 相当于 DROP + ,速度极快,不记日志(因此无法回滚),且重置自增 ID。适合清空测试数据,生产慎用。

4. 批量数据导入导出思路

实际工作中经常需要将 CSV 或外部数据导入 MySQL,或者导出备份。这里给出 实现方案。

4.1 从 CSV 文件导入

假设有 .csv 文件:

title,price,stock
机器学习,79.00,40
深度学习,89.00,30

import csv
with open("products.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    data = [(row['title'], row['price'], row['stock']) for row in reader]
sql = "INSERT INTO products (title, price, stock) VALUES (%s, %s, %s)"
cursor.executemany(sql, data)
conn.commit()
print(f" 从 CSV 导入了 {cursor.rowcount} 行")

4.2 导出到 CSV

cursor.execute("SELECT title, price, stock FROM products WHERE is_deleted = 0")
rows = cursor.fetchall()
with open("export_products.csv", "w", newline='', encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(["title", "price", "stock"])
    writer.writerows(rows)
print(" 导出完成")

更高效的方式是使用 MySQL 自带的 INTO ,但需服务器文件权限。 方案更灵活。

5. 事务在 DML 中的角色

DML 操作通常在事务中执行,保证原子性:要么全成功,要么全回滚。 默认需要在 DML 后显式 (),否则关闭连接时自动回滚。

try:
    cursor.execute("UPDATE products SET stock = stock - 10 WHERE id = 1")
    cursor.execute("UPDATE products SET stock = stock + 10 WHERE id = 2")
    conn.commit()
except Exception as e:
    conn.rollback()
    print(f" 事务回滚: {e}")

这是实现转账、库存扣减等业务的基础。后续文章会深入讲解事务隔离级别与锁。

6. 动手试试:搭建一个小型进货系统

模拟一个图书进货流程:

插入新书,如果已存在则累加库存。更新库存时,如果更新后库存为负则回滚(使用 检查)。将所有价格低于 60 元的书打 9 折。导出当前全部库存到 CSV。

你可以基于前面的 表练习mysql executeupdate,参考代码框架如下:

# 进货
book = ("Python 入门书", 59.90, 20)
cursor.execute("""
INSERT INTO products (title, price, stock) VALUES (%s,%s,%s)
ON DUPLICATE KEY UPDATE stock = stock + VALUES(stock)
""", book)
# 安全扣减库存
cursor.execute("SELECT stock FROM products WHERE id = 1")
stock = cursor.fetchone()[0]
if stock >= 5:
    cursor.execute("UPDATE products SET stock = stock - 5 WHERE id = 1")
    conn.commit()
else:
    print("库存不足")
# 打折
cursor.execute("UPDATE products SET price = price * 0.9 WHERE price < 60")
conn.commit()
# 导出(代码见前)

7. 总结

DML 看似简单,却是日常工作中最容易出事故的地方。记住三条铁律:

下一篇我们将进入 查询的艺术,学习如何从海量数据中精准、高效地取出想要的内容。下次见!

想了解更多还可以去各个平台搜索「IT策士」,一起升级 IT 思维 !

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » mysql executeupdate MySQL 系列:第4篇 增删改有章法(DML)

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们