sqlite Upsert(插入...在CLONFLICT上...执行更新)失败

zlwx9yxi  于 2022-11-15  发布在  SQLite
关注(0)|答案(2)|浏览(235)

我的table:

CREATE TABLE "tests" (
"testId"    INTEGER PRIMARY KEY AUTOINCREMENT,
"testUser"  INTEGER UNIQUE,
"testName"  INTEGER UNIQUE
);

简单的向上插入起作用:

INSERT INTO tests (testUser,testName)
VALUES (2,5)
ON CONFLICT (testUser) 
DO UPDATE SET testUser=2, testName=5

但我有两个UNIQUE列,需要在testUsertestName中发生冲突时触发UPDATE。因此,我需要在ON CONFLICT部分中检查它们:

INSERT INTO tests (testUser,testName)
VALUES (2,9)
ON CONFLICT (testUser, testName)
DO UPDATE SET testUser=2, testName=9

上述SQL命令失败,并显示以下错误:
ON冲突子句与任何主键或唯一约束都不匹配
DBFIDDLE和我尝试过的组合。
1.出了什么问题?在upsert查询中不能有多个唯一的ON CONFLICT列吗?
1.除了REPLACE INTO之外,还有没有其他方法可以达到upsert的效果?
我可能会使用REPLACE INTO,但REPLACE INTO执行的外键约束会在DELETE上的另一个表中造成严重破坏。

hsgswve4

hsgswve41#

错误是非常明显的。
对于ON CONFLICT (testUser, testName),您需要一个组合的唯一主键或组合的主键。
如样品中所示

CREATE TABLE "tests" (
    "testId"    INTEGER PRIMARY KEY AUTOINCREMENT,
    "testUser"  INTEGER UNIQUE,
    "testName"  INTEGER UNIQUE,
  UNIQUE("testName" ,"testUser")
);
INSERT INTO tests (testUser,testName) 
  VALUES (2,3);
  
  INSERT INTO tests (testUser,testName)
  VALUES (2,9)
  ON CONFLICT (testUser, testName) 
  DO UPDATE SET testUser=2, testName=9
55ooxyrt

55ooxyrt2#

从Sqlite版本3.35.0开始,在SQLite版本3.35.0(2021-03-12)中,您可以有多个ON冲突子句和一个没有冲突目标的DO UPDATE解决方案。因此,您可以将命令编写为:

INSERT INTO tests (testUser,testName)
VALUES (2,9)
ON CONFLICT (testUser)
DO UPDATE SET testUser=2, testName=9
ON CONFLICT (testName)
DO UPDATE SET testUser=2, testName=9

INSERT INTO tests (testUser,testName)
VALUES (2,9)
ON CONFLICT
DO UPDATE SET testUser=2, testName=9

请注意,要在DBFIDDLE中测试它,您需要选择高于3.35.0的SQLite版本

相关问题