mirror of
https://gitcode.com/ageerle/ruoyi-ai.git
synced 2026-09-13 16:34:57 +00:00
1. 升级脚本 2026-07-20-knowledge-fragment-fid.sql 使用了 MySQL 8 不支持的 ADD COLUMN IF NOT EXISTS(MariaDB 语法),在存量库执行会直接语法报错。 改为与脚本内索引守卫一致的 information_schema 判断 + PREPARE 方式,保持幂等。 2. parse() 重新解析时按 fragment.fid 删除旧向量:存量数据的 fid 为迁移脚本 回填的 MD5 值,与向量库中实际存储的随机 fid 不一致,首次重解析无法命中 旧向量,导致新旧向量重复累积。改为写入新向量前先按 docId 清理(三种 向量库策略均支持),写入失败时仍补偿删除新 fid。 Co-Authored-By: Claude <noreply@anthropic.com>
59 lines
3.2 KiB
SQL
59 lines
3.2 KiB
SQL
-- RAG metadata migration (MySQL 8). Safe to execute repeatedly.
|
||
-- 注意:MySQL 8 不支持 ALTER TABLE ... ADD COLUMN IF NOT EXISTS(仅 MariaDB 支持),
|
||
-- 因此列的增量添加统一用 information_schema 守卫 + PREPARE 实现幂等。
|
||
SET @add_file_hash_col = IF(EXISTS(
|
||
SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE()
|
||
AND table_name = 'knowledge_attach' AND column_name = 'file_hash'),
|
||
'SELECT 1',
|
||
'ALTER TABLE `knowledge_attach` ADD COLUMN `file_hash` varchar(64) NULL DEFAULT NULL COMMENT ''文件SHA-256摘要'' AFTER `doc_id`');
|
||
PREPARE stmt FROM @add_file_hash_col; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||
|
||
ALTER TABLE `knowledge_attach`
|
||
MODIFY COLUMN `doc_id` varchar(32) NULL DEFAULT NULL COMMENT '文档ID';
|
||
|
||
SET @add_file_hash = IF(EXISTS(
|
||
SELECT 1 FROM information_schema.statistics WHERE table_schema = DATABASE()
|
||
AND table_name = 'knowledge_attach' AND index_name = 'uk_knowledge_file_hash'),
|
||
'SELECT 1', 'ALTER TABLE `knowledge_attach` ADD UNIQUE INDEX `uk_knowledge_file_hash` (`knowledge_id`, `file_hash`)');
|
||
PREPARE stmt FROM @add_file_hash; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||
|
||
SET @add_fid_col = IF(EXISTS(
|
||
SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE()
|
||
AND table_name = 'knowledge_fragment' AND column_name = 'fid'),
|
||
'SELECT 1',
|
||
'ALTER TABLE `knowledge_fragment` ADD COLUMN `fid` varchar(32) NULL DEFAULT NULL COMMENT ''向量库片段ID'' AFTER `id`');
|
||
PREPARE stmt FROM @add_fid_col; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||
|
||
ALTER TABLE `knowledge_fragment`
|
||
MODIFY COLUMN `doc_id` varchar(32) NULL DEFAULT NULL COMMENT '文档ID';
|
||
|
||
UPDATE `knowledge_fragment`
|
||
SET `fid` = LOWER(MD5(CONCAT('knowledge_fragment:', `id`)))
|
||
WHERE `fid` IS NULL OR `fid` = '';
|
||
|
||
SET @drop_idx_fid = IF(EXISTS(
|
||
SELECT 1 FROM information_schema.statistics WHERE table_schema = DATABASE()
|
||
AND table_name = 'knowledge_fragment' AND index_name = 'idx_fid'),
|
||
'ALTER TABLE `knowledge_fragment` DROP INDEX `idx_fid`', 'SELECT 1');
|
||
PREPARE stmt FROM @drop_idx_fid; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||
|
||
SET @add_uk_fid = IF(EXISTS(
|
||
SELECT 1 FROM information_schema.statistics WHERE table_schema = DATABASE()
|
||
AND table_name = 'knowledge_fragment' AND index_name = 'uk_fid'),
|
||
'SELECT 1', 'ALTER TABLE `knowledge_fragment` ADD UNIQUE INDEX `uk_fid` (`fid`)');
|
||
PREPARE stmt FROM @add_uk_fid; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||
|
||
ALTER TABLE `knowledge_fragment` MODIFY COLUMN `fid` varchar(32) NOT NULL COMMENT '向量库片段ID';
|
||
|
||
SET @add_tenant_user = IF(EXISTS(
|
||
SELECT 1 FROM information_schema.statistics WHERE table_schema = DATABASE()
|
||
AND table_name = 'knowledge_info' AND index_name = 'idx_tenant_user'),
|
||
'SELECT 1', 'ALTER TABLE `knowledge_info` ADD INDEX `idx_tenant_user` (`tenant_id`, `user_id`)');
|
||
PREPARE stmt FROM @add_tenant_user; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||
|
||
SET @add_tenant_share = IF(EXISTS(
|
||
SELECT 1 FROM information_schema.statistics WHERE table_schema = DATABASE()
|
||
AND table_name = 'knowledge_info' AND index_name = 'idx_tenant_share'),
|
||
'SELECT 1', 'ALTER TABLE `knowledge_info` ADD INDEX `idx_tenant_share` (`tenant_id`, `share`)');
|
||
PREPARE stmt FROM @add_tenant_share; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|