如果符合条件,则插入行或更新行。用重复的术语,不是唯一的

Insert line or update line if it matches a condition. With repeated terms, not unique

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

我需要更新连续剧中一季的剧集数。我有一个 table 有 3000 行,我需要一条一条地检查,如果记录不存在,我将插入一个新行,如果它已经存在,则更新该行。 我有这个例子 table:

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,'1 Contra Todos',2,8,0);
INSERT INTO "series_test" VALUES (2,'1 Contra Todos',3,8,0);
INSERT INTO "series_test" VALUES (2,'1 Contra Todos',4,8,0);
INSERT INTO "series_test" VALUES (175,'Band Of Brothers',1,10,10);
INSERT INTO "series_test" VALUES (175,'Band Of Brothers',2,0,4);
INSERT INTO "series_test" VALUES (175,'Band Of Brothers',3,0,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', 3, 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, 'serie_name': 'Band Of Brothers','season': 4,' episode_dub': 1, 'episode_leg': 3}

您可以为 serie_nameseason 列定义复合 UNIQUE 约束:

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