Files
qiming/qiming-backend/sql/update-20260701.sql
2026-07-13 09:14:01 +08:00

274 lines
14 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- Qiming backend upgrade SQL for the 2026-07 open-source server increment.
--
-- Preconditions:
-- 1. Execute after the existing migration chain, including update-20260602.sql.
-- 2. Target database is MySQL-compatible and supports InnoDB JSON columns.
-- 3. The FULLTEXT index on published uses WITH PARSER ngram; verify the target
-- MySQL deployment has the ngram full-text parser enabled before running.
--
-- This script is written to be repeatable for schema objects added here:
-- tables use IF NOT EXISTS, and columns/indexes are guarded by information_schema.
DELIMITER $$
DROP PROCEDURE IF EXISTS qiming_add_column_if_not_exists$$
CREATE PROCEDURE qiming_add_column_if_not_exists(
IN p_table_name VARCHAR(64),
IN p_column_name VARCHAR(64),
IN p_alter_sql TEXT
)
BEGIN
IF EXISTS (
SELECT 1
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = p_table_name
) AND NOT EXISTS (
SELECT 1
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = p_table_name
AND COLUMN_NAME = p_column_name
) THEN
SET @qiming_sql = p_alter_sql;
PREPARE qiming_stmt FROM @qiming_sql;
EXECUTE qiming_stmt;
DEALLOCATE PREPARE qiming_stmt;
END IF;
END$$
DROP PROCEDURE IF EXISTS qiming_add_index_if_not_exists$$
CREATE PROCEDURE qiming_add_index_if_not_exists(
IN p_table_name VARCHAR(64),
IN p_index_name VARCHAR(64),
IN p_alter_sql TEXT
)
BEGIN
IF EXISTS (
SELECT 1
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = p_table_name
) AND NOT EXISTS (
SELECT 1
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = p_table_name
AND INDEX_NAME = p_index_name
) THEN
SET @qiming_sql = p_alter_sql;
PREPARE qiming_stmt FROM @qiming_sql;
EXECUTE qiming_stmt;
DEALLOCATE PREPARE qiming_stmt;
END IF;
END$$
DROP PROCEDURE IF EXISTS qiming_modify_column_if_exists$$
CREATE PROCEDURE qiming_modify_column_if_exists(
IN p_table_name VARCHAR(64),
IN p_column_name VARCHAR(64),
IN p_alter_sql TEXT
)
BEGIN
IF EXISTS (
SELECT 1
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = p_table_name
AND COLUMN_NAME = p_column_name
) THEN
SET @qiming_sql = p_alter_sql;
PREPARE qiming_stmt FROM @qiming_sql;
EXECUTE qiming_stmt;
DEALLOCATE PREPARE qiming_stmt;
END IF;
END$$
DELIMITER ;
CREATE TABLE IF NOT EXISTS `cm_content`
(
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`_tenant_id` BIGINT NOT NULL DEFAULT 1 COMMENT '租户ID',
`title` VARCHAR(256) NOT NULL COMMENT '标题',
`content` MediumText COMMENT '内容',
`media_url` VARCHAR(512) COMMENT '多媒体链接地址',
`is_external_link` TINYINT NOT NULL DEFAULT 0 COMMENT '是否为外链',
`external_link_url` VARCHAR(512) COMMENT '外链地址',
`is_carousel` TINYINT NOT NULL DEFAULT 0 COMMENT '是否轮播展示',
`category_id` BIGINT COMMENT '分类ID',
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`is_home_show` TINYINT DEFAULT 0 COMMENT '首页展示',
PRIMARY KEY (`id`),
KEY `idx_carousel` (`_tenant_id`, `is_carousel`),
KEY `idx_category` (`_tenant_id`, `category_id`),
KEY `idx_tenant` (`_tenant_id`)
);
CREATE TABLE IF NOT EXISTS `cm_category`
(
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`_tenant_id` BIGINT NOT NULL DEFAULT 1 COMMENT '租户ID',
`name` VARCHAR(128) NOT NULL COMMENT '分类名称',
`code` VARCHAR(64) NOT NULL COMMENT '分类编码',
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_tenant_code` (`_tenant_id`, `code`),
KEY `idx_tenant` (`_tenant_id`)
);
CREATE TABLE IF NOT EXISTS `target_recommend`
(
`id` BIGINT NOT NULL AUTO_INCREMENT,
`_tenant_id` BIGINT NOT NULL DEFAULT 1 COMMENT '商户ID',
`target_type` VARCHAR(32) NOT NULL COMMENT '目标类型: Agent, PageApp, Skill, Plugin, Workflow',
`target_id` BIGINT NOT NULL COMMENT '目标对象ID',
`rec_type` VARCHAR(32) NOT NULL COMMENT '推荐类型: Home, Official, ChatBoxNav',
`function_type` VARCHAR(32) COMMENT '功能类型: AgentDev, PageAppDev, SkillDev, PluginDev, Chat',
`label` VARCHAR(128) COMMENT '标签名称',
`icon` VARCHAR(512) COMMENT '图标',
`placeholder` TEXT COMMENT '默认内容, JSON数组格式',
`sort` INT NOT NULL DEFAULT 0 COMMENT '排序',
`modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_tenant_rec_type` (`_tenant_id`, `rec_type`)
);
CREATE TABLE IF NOT EXISTS `eco_market_import_record`
(
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`_tenant_id` BIGINT NOT NULL COMMENT '租户ID',
`user_id` BIGINT NOT NULL COMMENT '用户ID',
`space_id` BIGINT NOT NULL COMMENT '空间ID',
`target_type` VARCHAR(50) NOT NULL COMMENT '目标类型',
`target_id` BIGINT NOT NULL COMMENT '目标ID',
`eco_target_id` VARCHAR(32) NOT NULL COMMENT '生态市场对应目标ID',
`created` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modified` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
KEY `idx_tenant_space` (`_tenant_id`, `space_id`, `target_type`),
KEY `idx_tenant_user` (`_tenant_id`, `user_id`)
);
CREATE TABLE IF NOT EXISTS `resource_group_relation`
(
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`_tenant_id` BIGINT NOT NULL COMMENT '租户ID',
`target_type` VARCHAR(50) NOT NULL COMMENT '资源类型Plugin、Workflow',
`target_id` BIGINT NOT NULL COMMENT '资源ID',
`group_id` BIGINT NOT NULL COMMENT '分组ID',
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
KEY `idx_group_id` (`group_id`),
KEY `idx_target` (`target_type`, `target_id`)
);
CREATE TABLE IF NOT EXISTS `resource_group`
(
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`_tenant_id` BIGINT NOT NULL COMMENT '租户ID',
`space_id` BIGINT NOT NULL COMMENT '空间ID',
`creator_id` BIGINT NOT NULL COMMENT '创建者ID',
`name` VARCHAR(255) NOT NULL COMMENT '分组名称',
`description` VARCHAR(500) COMMENT '分组名称',
`icon` VARCHAR(2000) COMMENT '分组icon',
`tool_count` INT NOT NULL DEFAULT 0 COMMENT '工具数量',
`type` VARCHAR(50) NOT NULL COMMENT '分组类型Plugin、Workflow',
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
KEY `idx_space_id` (`space_id`, `type`)
);
CREATE TABLE IF NOT EXISTS `knowledge_recall_verification`
(
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键id',
`kb_id` BIGINT NOT NULL COMMENT '文档所属知识库',
`query_text` VARCHAR(128) NOT NULL COMMENT '查询内容',
`_tenant_id` BIGINT NOT NULL COMMENT '租户ID',
`space_id` BIGINT COMMENT '所属空间ID',
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`creator_id` BIGINT COMMENT '创建人id',
`creator_name` VARCHAR(64) COMMENT '创建人',
`modified` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
`modified_id` BIGINT COMMENT '最后修改人id',
`modified_name` VARCHAR(64) COMMENT '最后修改人',
`search_strategy` VARCHAR(255),
`query_result` LongText,
PRIMARY KEY (`id`),
KEY `idx_id_kb_id_index` (`space_id`, `kb_id`),
KEY `idx_kb_id` (`kb_id`)
);
CALL qiming_add_index_if_not_exists('agent_component_config', 'idx_type',
'ALTER TABLE `agent_component_config` ADD KEY `idx_type` (`type`, `target_id`)');
CALL qiming_add_index_if_not_exists('agent_component_config', 'idx_agent_id',
'ALTER TABLE `agent_component_config` ADD KEY `idx_agent_id` (`agent_id`)');
CALL qiming_add_column_if_not_exists('model_config', 'sort',
'ALTER TABLE `model_config` ADD COLUMN `sort` INT NOT NULL DEFAULT 0 COMMENT ''排序''');
CALL qiming_add_column_if_not_exists('published', 'group_id',
'ALTER TABLE `published` ADD COLUMN `group_id` BIGINT COMMENT ''分组id''');
CALL qiming_add_index_if_not_exists('published', 'idx_group_id',
'ALTER TABLE `published` ADD KEY `idx_group_id` (`group_id`)');
CALL qiming_add_index_if_not_exists('published', 'ft_name_desc',
'ALTER TABLE `published` ADD FULLTEXT KEY `ft_name_desc` (`name`, `description`) WITH PARSER ngram');
CALL qiming_add_column_if_not_exists('agent_config', 'enable_version_control',
'ALTER TABLE `agent_config` ADD COLUMN `enable_version_control` TINYINT NOT NULL DEFAULT 0 COMMENT ''是否启用版本控制''');
CALL qiming_add_column_if_not_exists('agent_config', 'dev_agent_conversation_id',
'ALTER TABLE `agent_config` ADD COLUMN `dev_agent_conversation_id` BIGINT COMMENT ''开发Agent的会话ID''');
CALL qiming_add_column_if_not_exists('agent_config', 'allow_choose_mode',
'ALTER TABLE `agent_config` ADD COLUMN `allow_choose_mode` TINYINT NOT NULL DEFAULT 0 COMMENT ''允许选择Agent交互模式''');
CALL qiming_add_column_if_not_exists('agent_config', 'sub_type',
'ALTER TABLE `agent_config` ADD COLUMN `sub_type` VARCHAR(32) COMMENT ''智能体(应用)子类型''');
CALL qiming_add_column_if_not_exists('agent_config', 'publish_version',
'ALTER TABLE `agent_config` ADD COLUMN `publish_version` JSON COMMENT ''发布版本记录''');
CALL qiming_add_column_if_not_exists('agent_config', 'enable_ask_question',
'ALTER TABLE `agent_config` ADD COLUMN `enable_ask_question` TINYINT NOT NULL DEFAULT 1 COMMENT ''打开询问用户''');
CALL qiming_add_column_if_not_exists('workflow_config', 'type',
'ALTER TABLE `workflow_config` ADD COLUMN `type` VARCHAR(32) DEFAULT ''Workflow'' COMMENT ''类型Workflow和AgentFlow''');
CALL qiming_add_column_if_not_exists('workflow_config', 'agent_id',
'ALTER TABLE `workflow_config` ADD COLUMN `agent_id` BIGINT COMMENT ''类型为AgentFlow时关联的AgentID''');
CALL qiming_add_column_if_not_exists('conversation', 'dev_target_type',
'ALTER TABLE `conversation` ADD COLUMN `dev_target_type` VARCHAR(32) COMMENT ''开发的目标对象''');
CALL qiming_add_column_if_not_exists('conversation', 'dev_target_id',
'ALTER TABLE `conversation` ADD COLUMN `dev_target_id` VARCHAR(32) COMMENT ''开发的目标对象ID''');
CALL qiming_add_column_if_not_exists('conversation', 'icon',
'ALTER TABLE `conversation` ADD COLUMN `icon` VARCHAR(500) COMMENT ''会话主题图标''');
CALL qiming_add_column_if_not_exists('conversation', 'dev_space_id',
'ALTER TABLE `conversation` ADD COLUMN `dev_space_id` BIGINT COMMENT ''开发所在的空间ID''');
CALL qiming_modify_column_if_exists('pricing_config', 'price',
'ALTER TABLE `pricing_config` MODIFY COLUMN `price` DECIMAL(20,6) COMMENT ''价格(单次、买断、包月时有效)''');
CALL qiming_modify_column_if_exists('knowledge_config', 'description',
'ALTER TABLE `knowledge_config` MODIFY COLUMN `description` VARCHAR(10000) COMMENT ''知识库描述''');
CALL qiming_modify_column_if_exists('bill_order', 'amount',
'ALTER TABLE `bill_order` MODIFY COLUMN `amount` DECIMAL(20,6) NOT NULL DEFAULT 0.000000 COMMENT ''订单金额''');
CALL qiming_modify_column_if_exists('custom_table_definition', 'table_description',
'ALTER TABLE `custom_table_definition` MODIFY COLUMN `table_description` VARCHAR(10000) COMMENT ''表描述''');
CALL qiming_modify_column_if_exists('bill_order_item', 'price',
'ALTER TABLE `bill_order_item` MODIFY COLUMN `price` DECIMAL(20,6) NOT NULL DEFAULT 0.000000 COMMENT ''单价''');
CALL qiming_modify_column_if_exists('resource_group', 'icon',
'ALTER TABLE `resource_group` MODIFY COLUMN `icon` VARCHAR(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT ''分组icon''');
CALL qiming_add_column_if_not_exists('skill_config', 'dev_agent_conversation_id',
'ALTER TABLE `skill_config` ADD COLUMN `dev_agent_conversation_id` BIGINT COMMENT ''开发会话ID''');
CALL qiming_add_column_if_not_exists('plugin_config', 'dev_agent_conversation_id',
'ALTER TABLE `plugin_config` ADD COLUMN `dev_agent_conversation_id` BIGINT COMMENT ''开发会话ID''');
CALL qiming_add_index_if_not_exists('workflow_node_config', 'idx_workflow_id',
'ALTER TABLE `workflow_node_config` ADD KEY `idx_workflow_id` (`workflow_id`)');
DROP PROCEDURE IF EXISTS qiming_add_column_if_not_exists;
DROP PROCEDURE IF EXISTS qiming_add_index_if_not_exists;
DROP PROCEDURE IF EXISTS qiming_modify_column_if_exists;