SQLite如何从两字段提取去重值插入新表并生成自增主键
前提准备:确认TableB的表结构
要实现自增主键+值不重复的需求,首先需要保证TableB的表结构设置正确,建议先执行建表语句(已经建过表可跳过,若原有TableB没有UNIQUE约束建议调整结构):
CREATE TABLE IF NOT EXISTS TableB ( id INTEGER PRIMARY KEY AUTOINCREMENT, E TEXT UNIQUE NOT NULL );
给E列加UNIQUE约束可以从数据库层面避免重复值插入,比自行代码校验更可靠。
调整后的插入SQL和Python代码
你原有代码存在三个问题:一是表名错误(源表是tableName不是TableA),二是没有合并B、C两列的查询结果,三是没有做重复值规避逻辑。调整后的完整代码如下:
import sqlite3 con = sqlite3.connect('path//DBv15.db') cur = con.cursor() # 确保TableB结构正确,已建表可注释掉该段 cur.execute(""" CREATE TABLE IF NOT EXISTS TableB ( id INTEGER PRIMARY KEY AUTOINCREMENT, E TEXT UNIQUE NOT NULL ); """) # 合并B、C两列去重后插入,重复值自动忽略 cur.execute(""" INSERT OR IGNORE INTO TableB(E) SELECT B FROM tableName UNION SELECT C FROM tableName; """) con.commit() con.close()
逻辑说明
- 源表名为
tableName,你原代码中写的TableA属于表名错误,已修正 UNION操作会自动合并两个SELECT语句查询到的B列、C列的结果并去重,不需要额外加DISTINCT;如果使用UNION ALL则不会去重,这里用UNION符合你的需求INSERT OR IGNORE是SQLite特有的语法,依赖TableB中E列的UNIQUE约束,当插入的E值已经存在时,会直接跳过该条记录不会抛出错误,天然实现了插入前的重复校验,不需要额外编写查询判断逻辑- 自增主键id会在插入新值时自动生成,最终TableB的内容和你给出的预期效果完全一致
内容的提问来源于stack exchange,提问作者MAb2021
相关产品推荐
相关产品推荐

