fix(sync): 修复 Oracle id 重排导致的 sync_videos/sync_people 1062

Oracle 库重建/重排后 videos/people 的 id 跳变(2303 段→3408/4600+ 段),
旧 upsert 按 Oracle id 作主键插入时与已存在同 filename/label 行在 UNIQUE 键
上二次冲突报 1062,整批中止、游标不推进。

- upsert_sync_videos: 改为以 filename 业务键去重,命中就地 UPDATE 保留 NAS 原
  id(防 sync_events/model_calls/identity_map 的 video_id 外键失效),Oracle id
  落 oracle_id 列溯源;未命中插入优先用 Oracle id 对齐子表引用,主键冲突回退自增
- upsert_sync_people: 同模式,以 label 业务键去重(people.id 无外键引用)
- ddl.sql: sync_videos/sync_people 的 id 改为 NAS 本地自增主键 + 新增 oracle_id 列
- NAS 现网已迁移(加列/回填/改自增)并重启验证:单批补拉 videos+348 events+1017
  people+9 model_calls+500 identity_map+238,游标 09-02 13:55:21 → 09-03 08:51:11
This commit is contained in:
ericwyuan
2026-09-03 09:00:50 +08:00
parent 2ad0472578
commit 0238030128
2 changed files with 115 additions and 52 deletions

View File

@@ -128,8 +128,13 @@ CREATE TABLE IF NOT EXISTS family_members (
-- ============================================================
-- 7.1 视频会话表Oracle videos 镜像)
-- v2 (2026-09-03)id 改为 NAS 本地自增主键(不再直接等于 Oracle id因 Oracle 库
-- 重建/重排会复用 id导致 filename UNIQUE 二次冲突 1062Oracle 的 videos.id 仅
-- 落 oracle_id 列溯源。业务唯一键仍为 filename。子表 video_id 引用仍用 Oracle id
-- (新视频插入时 id=oracle_id旧视频原地更新保留原 id外键不失效
CREATE TABLE IF NOT EXISTS sync_videos (
id INT PRIMARY KEY COMMENT 'Oracle videos.id',
id INT AUTO_INCREMENT PRIMARY KEY COMMENT 'NAS 本地自增主键',
oracle_id INT COMMENT 'Oracle videos.id仅溯源参考',
drive_file_id VARCHAR(255) COMMENT 'Google 硬盘文件 ID',
filename VARCHAR(500) NOT NULL UNIQUE COMMENT '视频文件名(唯一)',
camera_name VARCHAR(50) COMMENT '摄像头名称/位置',
@@ -164,8 +169,11 @@ CREATE TABLE IF NOT EXISTS sync_events (
) ENGINE=InnoDB COMMENT='甲骨文事件镜像表';
-- 7.3 人物规范表Oracle people 镜像)
-- v2 (2026-09-03):同 7.1id 改为 NAS 本地自增主键Oracle people.id 落 oracle_id
-- 列溯源;业务唯一键仍为 label。people.id 无外键引用,仅作展示排序。
CREATE TABLE IF NOT EXISTS sync_people (
id INT PRIMARY KEY COMMENT 'Oracle people.id',
id INT AUTO_INCREMENT PRIMARY KEY COMMENT 'NAS 本地自增主键',
oracle_id INT COMMENT 'Oracle people.id仅溯源参考',
label VARCHAR(100) NOT NULL UNIQUE COMMENT '抽象标识,如"人物A"',
canonical_name VARCHAR(100) COMMENT '规范名(用户命名或 LLM 合并NULL 表示未命名',
first_seen VARCHAR(32) COMMENT '首次出现时间',