MySQL如何将字符串列表作为新列批量写入companies表
操作方案
整个操作分两部分完成:先给表新增目标列,再批量把列表值按行顺序匹配更新,不用逐行手写SQL。
1. 新增列语法
用ALTER TABLE语句添加新列,字符串类型字段用VARCHAR即可,注意列名如果是MySQL保留字需要用反引号包裹:
import MySQLdb # 替换为你自己的数据库连接参数 db = MySQLdb.connect(host="localhost", user="你的账号", passwd="你的密码", db="你的库名", charset='utf8mb4') cursor = db.cursor() # 新增fakeName列,字段长度根据实际存储的内容调整,默认允许为空 add_col_sql = "ALTER TABLE companies ADD COLUMN fakeName VARCHAR(255) DEFAULT NULL" cursor.execute(add_col_sql)
2. 批量更新列表值
你原来代码里写的INSERT语句是错的——INSERT是用来插入新行的,你现在是给已有行的新列赋值,要用UPDATE语句。
另外不要依赖MySQL默认的返回行顺序,必须按主键id升序取出所有行的id,和你的列表按索引一一对应后,用executemany批量更新,几百行数据执行效率很高:
lst_to_add = ["name1", "name2", "name3"] # 按id升序取所有行的主键,保证顺序和你列表的预期匹配顺序一致 cursor.execute("SELECT id FROM companies ORDER BY id ASC") row_ids = [row[0] for row in cursor.fetchall()] # 先做长度校验,避免列表长度和表行数不一致导致数据错位 if len(row_ids) != len(lst_to_add): raise ValueError("传入列表长度和表现有行数不匹配,请核对数据后再操作") # 组装更新参数,格式为(要填入的列值, 对应行id) update_data = [(lst_to_add[idx], row_ids[idx]) for idx in range(len(row_ids))] # 注意MySQLdb的参数占位符是%s,不是? update_sql = "UPDATE companies SET fakeName = %s WHERE id = %s" cursor.executemany(update_sql, update_data) # 提交事务、关闭连接 db.commit() cursor.close() db.close()
关键注意事项
- MySQLdb的参数占位符固定为
%s,不管字段是什么类型都用这个,不要用其他语法里的?占位符 - 取行id的时候必须加
ORDER BY id,否则MySQL返回的行顺序没有保障,很容易出现值和行错位的问题 - 批量操作前建议先备份表数据,避免操作失误无法回滚
执行完之后查询companies表,就能得到预期的结构和数据:
id originalName fakeName 1 Hannah name1 2 Joi name2 3 Kale name3
内容的提问来源于stack exchange,提问作者Jnl
相关产品推荐
相关产品推荐

