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

使用SQLite3命令行导入CSV时,通过BEFORE INSERT触发器更新主键冲突行

解决SQLite导入CSV时主键冲突更新列的问题

你的触发器存在两个关键问题:

  • INSERT OR REPLACE 和 ON CONFLICT DO UPDATE 是SQLite中互斥的冲突处理语法,不能混用
  • BEFORE INSERT触发器内执行插入操作会触发新的INSERT事件,导致循环触发

正确的触发器写法

CREATE TABLE "AllInventory" 
(
    "UID"   TEXT,
    "LotNumber" INTEGER,
    "ItemType"  TEXT,
    "AuctionDate"   TEXT,
    "AuctionHouse"  TEXT,
    "Location"  TEXT,
    PRIMARY KEY("UID")
);

CREATE TRIGGER BULK_Inventory_Update 
BEFORE INSERT ON AllInventory
FOR EACH ROW
WHEN EXISTS (SELECT 1 FROM AllInventory WHERE UID = New.UID)
BEGIN
    -- 直接更新已存在的行
    UPDATE AllInventory
    SET LotNumber = new.LotNumber,
        ItemType = new.ItemType,
        AuctionDate = new.AuctionDate,
        AuctionHouse = new.AuctionHouse,
        Location = new.Location
    WHERE UID = new.UID;
    -- 取消原插入操作,避免重复添加
    SELECT RAISE(IGNORE);
END;

导入CSV的命令示例

在sqlite3命令行中执行以下命令完成导入:

.mode csv
.import /path/to/your/inventory.csv AllInventory

原理说明

当导入CSV触发INSERT操作时,触发器会先检查UID是否已存在:

  1. 若存在:执行UPDATE更新对应列,然后用RAISE(IGNORE)跳过原INSERT操作
  2. 若不存在:触发器不执行任何额外操作,原INSERT正常插入新行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:20:03