问题描述
注意:不能使用 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}
解决方法
您可以为列 UNIQUE
和 serie_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。