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

SQLite中如何基于多ID组合实现行的插入或更新操作?

SQLite 实现多ID组合的插入/更新操作

首先你需要确保表中的ID, Part_ID, Location_ID组合是唯一的,这是实现「存在更新、不存在插入」的前提。

第一步:创建带唯一约束的表

如果还没建表,先执行以下语句,给三个ID组合添加主键约束(或UNIQUE约束):

CREATE TABLE IF NOT EXISTS my_table (
    ID INTEGER,
    Part_ID INTEGER,
    Location_ID INTEGER,
    Torque INTEGER,
    PRIMARY KEY (ID, Part_ID, Location_ID) -- 强制三ID组合唯一
);

如果已经建表,可添加唯一索引:

CREATE UNIQUE INDEX IF NOT EXISTS idx_unique_ids ON my_table (ID, Part_ID, Location_ID);

两种实现方案

方案1:整行替换(INSERT OR REPLACE)

你提供的示例语句有误,UPDATE OR REPLACE是INSERT的变种,不能加WHERE子句。正确写法是:

INSERT OR REPLACE INTO my_table (ID, Part_ID, Location_ID, Torque) 
VALUES (2, 6, 4, 100);

逻辑:如果(2,6,4)组合已存在,会删除旧行再插入新行;如果不存在则直接插入。
⚠️ 注意:如果表中有其他列,旧行的其他列数据会被清空(因为是删除后重新插入),适合需要整行替换的场景。

方案2:仅更新指定列(推荐)

SQLite 3.24.0及以上版本支持ON CONFLICT语法,可以只更新需要修改的列,保留其他列原有数据:

INSERT INTO my_table (ID, Part_ID, Location_ID, Torque) 
VALUES (2, 6, 4, 100)
ON CONFLICT(ID, Part_ID, Location_ID) DO UPDATE 
SET Torque = excluded.Torque;

逻辑:如果三ID组合已存在,仅更新Torque列的值为新传入的100;不存在则插入新行。excluded代表准备插入的那一行数据,确保更新的值和插入值一致。

备选:先查询再操作(不推荐)

如果你的SQLite版本过低,不支持ON CONFLICT,可以分两步:

  1. 查询目标行是否存在:
SELECT 1 FROM my_table WHERE ID=2 AND Part_ID=6 AND Location_ID=4;
  1. 根据查询结果执行对应操作:
    • 存在则更新:
      UPDATE my_table SET Torque=100 WHERE ID=2 AND Part_ID=6 AND Location_ID=4;
      
    • 不存在则插入:
      INSERT INTO my_table (ID, Part_ID, Location_ID, Torque) VALUES (2,6,4,100);
      

⚠️ 注意:这种方式不是原子操作,多线程/多进程操作时可能出现冲突,优先用前两种方案。

内容的提问来源于stack exchange,提问作者Bram Harbers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:25:33