You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 10:54:03