如果匹配条件,则插入行或更新行有重复的术语,不是唯一的

问题描述

注意:不能使用 ON CONFLICT,字段不是唯一的:serie_name 和 season 重复多次。

我需要更新系列剧中一季的集数。我有一个有3000行的表,我需要一一检查,如果记录不存在,我会插入一个新行,如果已经存在,更新该行。 我有这个示例表:

BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS "series_test" (
    "id_key"    INTEGER NOT NULL,"serie_name"    VARCHAR(100) NOT NULL,"season"    INTEGER,"episode_dub"   INTEGER,"episode_leg"   INTEGER
);
INSERT INTO "series_test" VALUES ('id_key','serie_name','season','episode_dub','episode_leg');
INSERT INTO "series_test" VALUES (2,'1 Contra Todos',1,8,0);
INSERT INTO "series_test" VALUES (2,2,3,4,0);
INSERT INTO "series_test" VALUES (175,'Band Of brothers',10,10);
INSERT INTO "series_test" VALUES (175,4);
INSERT INTO "series_test" VALUES (175,13);
COMMIT;

我需要插入一行,但如果字段数据已存在于“serie_name”和字段“season”中,则该命令只会更新记录。 如果条件不存在,插入...否则更新数据

逻辑如下:

IF EXISTS (SELECT * FROM series_test WHERE serie_name='Band Of brothers' AND season=3) 
    UPDATE series_test SET episode_dub=5 AND episode_leg=15 WHERE serie_name='Band Of brothers' AND season=3
ELSE 
    INSERT INTO series_test (serie_name,season,episode_dub,episode_leg) VALUES ('Band Of brothers',5,15)

最优化的方法是什么?


补充:

如果只使用 sql,我不知道这样做的最佳方法是什么。或者使用python + sql

我通过 python 进行网络抓取,以获取该系列每一季的最新剧集数据。我需要输入这些数据或更新它。

更新旧数据,增加一季集数

{'id_key': 175,'serie_name': 'Band Of brothers','season': 3,'episode_dub': 5,'episode_leg': 15}

插入新一季的剧集:

{'id_key': 175,'season': 4,' episode_dub': 1,'episode_leg': 3}

解决方法

您可以为列 UNIQUEserie_name 定义复合 season 约束:

CREATE TABLE IF NOT EXISTS series_test (
    id_key INTEGER NOT NULL,serie_name VARCHAR(100) NOT NULL,season INTEGER,episode_dub INTEGER,episode_leg INTEGER,UNIQUE(serie_name,season)
);

现在您可以使用 ON CONFLICT

INSERT INTO series_test (id_key,serie_name,season,episode_dub,episode_leg) VALUES 
  (175,'Band Of Brothers',3,5,15)
ON CONFLICT(serie_name,season) DO UPDATE
SET episode_dub = EXCLUDED.episode_dub,episode_leg = EXCLUDED.episode_leg

请注意,您还必须为列 id_key 提供一个值,因为它被定义为 NOT NULL

参见demo