From c661084bb804c9d65a54262fcb00f81ee4fea1c4 Mon Sep 17 00:00:00 2001 From: vipg Date: Wed, 19 Nov 2025 16:33:48 +0800 Subject: [PATCH] add --- backend/sql/04_country.sql | 18 +-- backend/src/logic4country/04_country.sql | 135 +++++++++++++++++++++++ 2 files changed, 145 insertions(+), 8 deletions(-) create mode 100644 backend/src/logic4country/04_country.sql diff --git a/backend/sql/04_country.sql b/backend/sql/04_country.sql index 0a72cfd..fdecfe4 100644 --- a/backend/sql/04_country.sql +++ b/backend/sql/04_country.sql @@ -98,17 +98,19 @@ BEGIN CREATE OR REPLACE VIEW country_info_view AS SELECT u.id AS country_id, - n.name AS name, - c.code AS code, - u.deleted AS deleted + n.name AS country_name, -- 国家名称 + c.code AS country_code, -- 国家代码 + f.flag AS country_flag, -- 国旗信息 FROM country u - JOIN - country_name n ON u.id = n.country_id - JOIN - country_code c ON u.id = c.country_id + LEFT JOIN + country_name n ON u.id = n.country_id AND n.deleted = FALSE -- 过滤已删除名称 + LEFT JOIN + country_code c ON u.id = c.country_id AND c.deleted = FALSE -- 过滤已删除代码 + LEFT JOIN + country_flag f ON u.id = f.country_id AND f.deleted = FALSE -- 左连接:允许无国旗数据 WHERE - u.deleted = FALSE; + u.deleted = FALSE; -- 只查询未删除的国家 -- 根据视图是否已存在输出不同提示 IF view_exists THEN diff --git a/backend/src/logic4country/04_country.sql b/backend/src/logic4country/04_country.sql new file mode 100644 index 0000000..73eb1d3 --- /dev/null +++ b/backend/src/logic4country/04_country.sql @@ -0,0 +1,135 @@ +-- 切换到目标数据库 +\c postgres; + +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'country') THEN + CREATE TABLE country ( + id UUID DEFAULT gen_random_uuid_v7() PRIMARY KEY NOT NULL, + deleted BOOLEAN NOT NULL DEFAULT FALSE, + created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP + ); + CREATE TRIGGER update_country_updated_at + BEFORE UPDATE ON "country" + FOR EACH ROW + EXECUTE FUNCTION update_data_modified_column(); + + RAISE NOTICE 'created country table and trigger'; + ELSE + RAISE NOTICE 'country table already exists'; + END IF; + + IF NOT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'country_name') THEN + CREATE TABLE country_name ( + id UUID DEFAULT gen_random_uuid_v7() PRIMARY KEY NOT NULL, + country_id UUID NOT NULL, + name VARCHAR NOT NULL, + deleted BOOLEAN NOT NULL DEFAULT FALSE, + created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP + ); + CREATE TRIGGER update_name_updated_at + BEFORE UPDATE ON "country_name" + FOR EACH ROW + EXECUTE FUNCTION update_data_modified_column(); + + RAISE NOTICE 'created country_name table and trigger'; + ELSE + RAISE NOTICE 'country_name table already exists'; + END IF; + + IF NOT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'country_code') THEN + CREATE TABLE country_code ( + id UUID DEFAULT gen_random_uuid_v7() PRIMARY KEY NOT NULL, + country_id UUID NOT NULL, + code VARCHAR NOT NULL, + deleted BOOLEAN NOT NULL DEFAULT FALSE, + created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP + ); + CREATE TRIGGER update_code_updated_at + BEFORE UPDATE ON "country_code" + FOR EACH ROW + EXECUTE FUNCTION update_data_modified_column(); + + RAISE NOTICE 'created country_code table and trigger'; + ELSE + RAISE NOTICE 'country_code table already exists'; + END IF; + + IF NOT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'country_flag') THEN + CREATE TABLE country_flag ( + id UUID DEFAULT gen_random_uuid_v7() PRIMARY KEY NOT NULL, + country_id UUID NOT NULL, + flag VARCHAR NOT NULL, + deleted BOOLEAN NOT NULL DEFAULT FALSE, + created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP + ); + CREATE TRIGGER update_flag_updated_at + BEFORE UPDATE ON "country_flag" + FOR EACH ROW + EXECUTE FUNCTION update_data_modified_column(); + + RAISE NOTICE 'created country_flag table and trigger'; + ELSE + RAISE NOTICE 'country_flag table already exists'; + END IF; +END $$; + +DO $$ +DECLARE + view_exists BOOLEAN; +BEGIN + -- 检查视图是否已存在 + SELECT EXISTS ( + SELECT 1 FROM information_schema.views + WHERE table_name = 'country_info_view' + ) INTO view_exists; + + -- 若视图存在,先删除(避免字段名冲突) + IF view_exists THEN + DROP VIEW country_info_view; + RAISE NOTICE '已删除旧视图 country_info_view'; + END IF; + + -- 创建或更新视图 + -- 创建新视图(关联所有子表,展示完整品种信息) + CREATE VIEW variety_info_view AS + SELECT + v.id AS variety_id, + vn.name AS variety_name, + vc.code AS variety_code, + vt.tick AS min_tick, -- 最小变动价位 + vtp.price AS tick_value, -- 变动价位价值 + ve.exchange_id, -- 关联的交易所ID + -- 关联交易所名称(需确保 exchange_name 表存在,若不需要可删除以下 2 行) + en.name AS exchange_name, + esn.short_name AS exchange_short_name, + v.deleted, + v.created_at, + v.updated_at + FROM + variety v + LEFT JOIN variety_name vn ON v.id = vn.variety_id AND vn.deleted = FALSE + LEFT JOIN variety_code vc ON v.id = vc.variety_id AND vc.deleted = FALSE + LEFT JOIN variety_tick vt ON v.id = vt.variety_id AND vt.deleted = FALSE + LEFT JOIN variety_tick_price vtp ON v.id = vtp.variety_id AND vtp.deleted = FALSE + LEFT JOIN variety_exchange ve ON v.id = ve.variety_id AND ve.deleted = FALSE + -- 关联交易所名称表(可选,根据实际需求决定是否保留) + LEFT JOIN exchange_name en ON ve.exchange_id = en.exchange_id AND en.deleted = FALSE + LEFT JOIN exchange_short_name esn ON ve.exchange_id = esn.exchange_id AND esn.deleted = FALSE + WHERE + v.deleted = FALSE; + + -- 根据视图是否已存在输出不同提示 + IF view_exists THEN + RAISE NOTICE '视图 country_info_view 已更新(删除旧视图后重建)'; + ELSE + RAISE NOTICE '视图 country_info_view 已创建'; + END IF; +EXCEPTION + WHEN OTHERS THEN + RAISE NOTICE '处理视图时发生错误: %', SQLERRM; +END $$;