使用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是否已存在:
- 若存在:执行UPDATE更新对应列,然后用
RAISE(IGNORE)跳过原INSERT操作 - 若不存在:触发器不执行任何额外操作,原INSERT正常插入新行
内容的提问来源于stack exchange,提问作者DonShaun
相关产品推荐
相关产品推荐

