mall数据库文件
This commit is contained in:
0
mall_sql/tests/create_supabase_auth_users.sql
Normal file
0
mall_sql/tests/create_supabase_auth_users.sql
Normal file
332
mall_sql/tests/mall_database_check.sql
Normal file
332
mall_sql/tests/mall_database_check.sql
Normal file
@@ -0,0 +1,332 @@
|
||||
-- =====================================================================================
|
||||
-- 商城系统数据库状态检查脚本
|
||||
-- 分析现有数据库结构,生成个性化ALTER建议
|
||||
-- =====================================================================================
|
||||
|
||||
-- =====================================================================================
|
||||
-- 1. 检查现有表结构
|
||||
-- =====================================================================================
|
||||
|
||||
-- 检查 ak_users 表字段情况
|
||||
DO $$
|
||||
DECLARE
|
||||
missing_fields TEXT[] := ARRAY[]::TEXT[];
|
||||
existing_fields TEXT[] := ARRAY[]::TEXT[];
|
||||
field_name TEXT;
|
||||
field_names TEXT[] := ARRAY['mall_status', 'mall_type', 'last_login_ip', 'total_orders', 'total_spent', 'user_level', 'points', 'verified_status'];
|
||||
BEGIN
|
||||
RAISE NOTICE '=======================================================';
|
||||
RAISE NOTICE '检查 ak_users 表字段状态';
|
||||
RAISE NOTICE '=======================================================';
|
||||
|
||||
FOREACH field_name IN ARRAY field_names LOOP
|
||||
IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ak_users' AND column_name = field_name) THEN
|
||||
existing_fields := array_append(existing_fields, field_name);
|
||||
RAISE NOTICE '✓ 字段已存在: %', field_name;
|
||||
ELSE
|
||||
missing_fields := array_append(missing_fields, field_name);
|
||||
RAISE NOTICE '✗ 字段缺失: %', field_name;
|
||||
END IF;
|
||||
END LOOP;
|
||||
|
||||
RAISE NOTICE '-------------------------------------------------------';
|
||||
RAISE NOTICE '已存在字段数量: %', array_length(existing_fields, 1);
|
||||
RAISE NOTICE '缺失字段数量: %', array_length(missing_fields, 1);
|
||||
|
||||
IF array_length(missing_fields, 1) > 0 THEN
|
||||
RAISE NOTICE '需要添加的字段: %', array_to_string(missing_fields, ', ');
|
||||
ELSE
|
||||
RAISE NOTICE 'ak_users 表所有商城字段均已存在';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- 检查商城表存在情况
|
||||
DO $$
|
||||
DECLARE
|
||||
table_name TEXT;
|
||||
table_names TEXT[] := ARRAY['ml_user_profiles', 'ml_user_addresses', 'ml_categories', 'ml_brands', 'ml_products', 'ml_product_skus', 'ml_shops', 'ml_orders', 'ml_shopping_cart'];
|
||||
existing_tables TEXT[] := ARRAY[]::TEXT[];
|
||||
missing_tables TEXT[] := ARRAY[]::TEXT[];
|
||||
BEGIN
|
||||
RAISE NOTICE '=======================================================';
|
||||
RAISE NOTICE '检查商城核心表存在情况';
|
||||
RAISE NOTICE '=======================================================';
|
||||
|
||||
FOREACH table_name IN ARRAY table_names LOOP
|
||||
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = table_name) THEN
|
||||
existing_tables := array_append(existing_tables, table_name);
|
||||
RAISE NOTICE '✓ 表已存在: %', table_name;
|
||||
ELSE
|
||||
missing_tables := array_append(missing_tables, table_name);
|
||||
RAISE NOTICE '✗ 表缺失: %', table_name;
|
||||
END IF;
|
||||
END LOOP;
|
||||
|
||||
RAISE NOTICE '-------------------------------------------------------';
|
||||
RAISE NOTICE '已存在表数量: %', array_length(existing_tables, 1);
|
||||
RAISE NOTICE '缺失表数量: %', array_length(missing_tables, 1);
|
||||
|
||||
IF array_length(missing_tables, 1) > 0 THEN
|
||||
RAISE NOTICE '需要创建的表: %', array_to_string(missing_tables, ', ');
|
||||
ELSE
|
||||
RAISE NOTICE '所有商城核心表均已存在';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- =====================================================================================
|
||||
-- 2. 检查现有索引情况
|
||||
-- =====================================================================================
|
||||
|
||||
-- 检查重要索引存在情况
|
||||
DO $$
|
||||
DECLARE
|
||||
index_info RECORD;
|
||||
missing_indexes TEXT[] := ARRAY[]::TEXT[];
|
||||
existing_indexes TEXT[] := ARRAY[]::TEXT[];
|
||||
BEGIN
|
||||
RAISE NOTICE '=======================================================';
|
||||
RAISE NOTICE '检查重要索引存在情况';
|
||||
RAISE NOTICE '=======================================================';
|
||||
|
||||
-- 定义重要索引列表
|
||||
FOR index_info IN
|
||||
SELECT * FROM (VALUES
|
||||
('idx_ak_users_mall_status', 'ak_users', 'mall_status'),
|
||||
('idx_ak_users_mall_type', 'ak_users', 'mall_type'),
|
||||
('idx_ak_users_total_orders', 'ak_users', 'total_orders'),
|
||||
('idx_ml_products_cid', 'ml_products', 'cid'),
|
||||
('idx_ml_products_slug', 'ml_products', 'slug'),
|
||||
('idx_ml_categories_cid', 'ml_categories', 'cid'),
|
||||
('idx_ml_orders_cid', 'ml_orders', 'cid'),
|
||||
('idx_ml_shops_cid', 'ml_shops', 'cid')
|
||||
) AS t(index_name, table_name, column_name)
|
||||
LOOP
|
||||
-- 检查表是否存在
|
||||
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = index_info.table_name) THEN
|
||||
-- 检查索引是否存在
|
||||
IF EXISTS (SELECT 1 FROM pg_indexes WHERE indexname = index_info.index_name) THEN
|
||||
existing_indexes := array_append(existing_indexes, index_info.index_name);
|
||||
RAISE NOTICE '✓ 索引已存在: % (表: %)', index_info.index_name, index_info.table_name;
|
||||
ELSE
|
||||
missing_indexes := array_append(missing_indexes, index_info.index_name);
|
||||
RAISE NOTICE '✗ 索引缺失: % (表: %)', index_info.index_name, index_info.table_name;
|
||||
END IF;
|
||||
ELSE
|
||||
RAISE NOTICE '○ 表不存在,跳过索引检查: % (表: %)', index_info.index_name, index_info.table_name;
|
||||
END IF;
|
||||
END LOOP;
|
||||
|
||||
RAISE NOTICE '-------------------------------------------------------';
|
||||
RAISE NOTICE '已存在索引数量: %', array_length(existing_indexes, 1);
|
||||
RAISE NOTICE '缺失索引数量: %', array_length(missing_indexes, 1);
|
||||
END $$;
|
||||
|
||||
-- =====================================================================================
|
||||
-- 3. 检查扩展和函数
|
||||
-- =====================================================================================
|
||||
|
||||
-- 检查必要的PostgreSQL扩展
|
||||
DO $$
|
||||
DECLARE
|
||||
ext_name TEXT;
|
||||
extensions TEXT[] := ARRAY['uuid-ossp', 'btree_gin'];
|
||||
existing_ext TEXT[] := ARRAY[]::TEXT[];
|
||||
missing_ext TEXT[] := ARRAY[]::TEXT[];
|
||||
BEGIN
|
||||
RAISE NOTICE '=======================================================';
|
||||
RAISE NOTICE '检查PostgreSQL扩展';
|
||||
RAISE NOTICE '=======================================================';
|
||||
|
||||
FOREACH ext_name IN ARRAY extensions LOOP
|
||||
IF EXISTS (SELECT 1 FROM pg_extension WHERE extname = ext_name) THEN
|
||||
existing_ext := array_append(existing_ext, ext_name);
|
||||
RAISE NOTICE '✓ 扩展已安装: %', ext_name;
|
||||
ELSE
|
||||
missing_ext := array_append(missing_ext, ext_name);
|
||||
RAISE NOTICE '✗ 扩展缺失: %', ext_name;
|
||||
END IF;
|
||||
END LOOP;
|
||||
|
||||
IF array_length(missing_ext, 1) > 0 THEN
|
||||
RAISE NOTICE '需要安装的扩展: %', array_to_string(missing_ext, ', ');
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- 检查商城相关函数
|
||||
DO $$
|
||||
DECLARE
|
||||
func_name TEXT;
|
||||
functions TEXT[] := ARRAY['generate_order_no', 'calculate_cart_total', 'update_user_mall_stats'];
|
||||
existing_funcs TEXT[] := ARRAY[]::TEXT[];
|
||||
missing_funcs TEXT[] := ARRAY[]::TEXT[];
|
||||
BEGIN
|
||||
RAISE NOTICE '=======================================================';
|
||||
RAISE NOTICE '检查商城相关函数';
|
||||
RAISE NOTICE '=======================================================';
|
||||
|
||||
FOREACH func_name IN ARRAY functions LOOP
|
||||
IF EXISTS (SELECT 1 FROM pg_proc WHERE proname = func_name) THEN
|
||||
existing_funcs := array_append(existing_funcs, func_name);
|
||||
RAISE NOTICE '✓ 函数已存在: %', func_name;
|
||||
ELSE
|
||||
missing_funcs := array_append(missing_funcs, func_name);
|
||||
RAISE NOTICE '✗ 函数缺失: %', func_name;
|
||||
END IF;
|
||||
END LOOP;
|
||||
|
||||
IF array_length(missing_funcs, 1) > 0 THEN
|
||||
RAISE NOTICE '需要创建的函数: %', array_to_string(missing_funcs, ', ');
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- =====================================================================================
|
||||
-- 4. 生成个性化建议
|
||||
-- =====================================================================================
|
||||
|
||||
DO $$
|
||||
DECLARE
|
||||
ak_users_missing INTEGER := 0;
|
||||
mall_tables_missing INTEGER := 0;
|
||||
suggestion TEXT := '';
|
||||
BEGIN
|
||||
RAISE NOTICE '=======================================================';
|
||||
RAISE NOTICE '个性化升级建议';
|
||||
RAISE NOTICE '=======================================================';
|
||||
|
||||
-- 统计ak_users缺失字段
|
||||
SELECT COUNT(*) INTO ak_users_missing
|
||||
FROM (VALUES ('mall_status'), ('mall_type'), ('total_orders'), ('total_spent')) AS t(field)
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_name = 'ak_users' AND column_name = t.field
|
||||
);
|
||||
|
||||
-- 统计商城表缺失情况
|
||||
SELECT COUNT(*) INTO mall_tables_missing
|
||||
FROM (VALUES ('ml_products'), ('ml_categories'), ('ml_orders'), ('ml_shops')) AS t(table_name)
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.tables
|
||||
WHERE table_name = t.table_name
|
||||
);
|
||||
|
||||
-- 生成建议
|
||||
IF ak_users_missing > 0 AND mall_tables_missing > 0 THEN
|
||||
suggestion := '建议使用 mall_alter_upgrade.sql(完整升级脚本)';
|
||||
ELSIF ak_users_missing > 0 AND mall_tables_missing = 0 THEN
|
||||
suggestion := '建议使用 mall_fields_only_upgrade.sql(仅字段升级脚本)';
|
||||
ELSIF ak_users_missing = 0 AND mall_tables_missing > 0 THEN
|
||||
suggestion := '建议使用 mall_migration.sql(表结构创建脚本)';
|
||||
ELSE
|
||||
suggestion := '数据库结构已完整,建议检查数据完整性和权限配置';
|
||||
END IF;
|
||||
|
||||
RAISE NOTICE '根据您的数据库状态分析:';
|
||||
RAISE NOTICE '• ak_users 表缺失字段数: %', ak_users_missing;
|
||||
RAISE NOTICE '• 缺失商城核心表数: %', mall_tables_missing;
|
||||
RAISE NOTICE '';
|
||||
RAISE NOTICE '推荐执行方案: %', suggestion;
|
||||
|
||||
-- 详细建议
|
||||
RAISE NOTICE '';
|
||||
RAISE NOTICE '详细执行步骤:';
|
||||
IF ak_users_missing > 0 THEN
|
||||
RAISE NOTICE '1. 先执行字段升级脚本为ak_users表添加商城字段';
|
||||
END IF;
|
||||
IF mall_tables_missing > 0 THEN
|
||||
RAISE NOTICE '2. 执行表结构创建脚本建立商城核心表';
|
||||
END IF;
|
||||
RAISE NOTICE '3. 执行SEO和安全策略脚本(mall_seo_security.sql)';
|
||||
RAISE NOTICE '4. 根据需要执行模拟数据插入脚本进行测试';
|
||||
END $$;
|
||||
|
||||
-- =====================================================================================
|
||||
-- 5. 生成具体的ALTER语句(可选)
|
||||
-- =====================================================================================
|
||||
|
||||
-- 生成ak_users表缺失字段的ALTER语句
|
||||
DO $$
|
||||
DECLARE
|
||||
alter_statements TEXT := '';
|
||||
field_name TEXT;
|
||||
field_configs TEXT[] := ARRAY[
|
||||
'mall_status INTEGER DEFAULT 1 CHECK (mall_status IN (1,2))',
|
||||
'mall_type INTEGER DEFAULT 1 CHECK (mall_type IN (1,2,3))',
|
||||
'total_orders INTEGER DEFAULT 0 CHECK (total_orders >= 0)',
|
||||
'total_spent DECIMAL(12,2) DEFAULT 0.00 CHECK (total_spent >= 0)',
|
||||
'user_level INTEGER DEFAULT 1 CHECK (user_level >= 1 AND user_level <= 10)',
|
||||
'points INTEGER DEFAULT 0 CHECK (points >= 0)',
|
||||
'verified_status INTEGER DEFAULT 0 CHECK (verified_status IN (0,1,2))'
|
||||
];
|
||||
field_names TEXT[] := ARRAY['mall_status', 'mall_type', 'total_orders', 'total_spent', 'user_level', 'points', 'verified_status'];
|
||||
i INTEGER;
|
||||
BEGIN
|
||||
RAISE NOTICE '=======================================================';
|
||||
RAISE NOTICE '生成ak_users表ALTER语句';
|
||||
RAISE NOTICE '=======================================================';
|
||||
|
||||
FOR i IN 1..array_length(field_names, 1) LOOP
|
||||
field_name := field_names[i];
|
||||
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ak_users' AND column_name = field_name) THEN
|
||||
alter_statements := alter_statements || format('ALTER TABLE public.ak_users ADD COLUMN %s;' || chr(10), field_configs[i]);
|
||||
RAISE NOTICE '需要执行: ALTER TABLE public.ak_users ADD COLUMN %;', field_configs[i];
|
||||
END IF;
|
||||
END LOOP;
|
||||
|
||||
IF alter_statements = '' THEN
|
||||
RAISE NOTICE 'ak_users表无需添加字段';
|
||||
ELSE
|
||||
RAISE NOTICE '';
|
||||
RAISE NOTICE '完整ALTER脚本:';
|
||||
RAISE NOTICE '%', alter_statements;
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- =====================================================================================
|
||||
-- 6. 数据完整性检查
|
||||
-- =====================================================================================
|
||||
|
||||
DO $$
|
||||
DECLARE
|
||||
users_count INTEGER;
|
||||
profiles_count INTEGER;
|
||||
BEGIN
|
||||
RAISE NOTICE '=======================================================';
|
||||
RAISE NOTICE '数据完整性检查';
|
||||
RAISE NOTICE '=======================================================';
|
||||
|
||||
-- 检查用户表数据
|
||||
SELECT COUNT(*) INTO users_count FROM public.ak_users;
|
||||
RAISE NOTICE 'ak_users 表用户数量: %', users_count;
|
||||
|
||||
-- 检查用户档案表(如果存在)
|
||||
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'ml_user_profiles') THEN
|
||||
SELECT COUNT(*) INTO profiles_count FROM public.ml_user_profiles;
|
||||
RAISE NOTICE 'ml_user_profiles 表档案数量: %', profiles_count;
|
||||
|
||||
IF users_count > profiles_count THEN
|
||||
RAISE NOTICE '注意: 有 % 个用户缺少商城档案,建议执行档案补充脚本', users_count - profiles_count;
|
||||
END IF;
|
||||
ELSE
|
||||
RAISE NOTICE 'ml_user_profiles 表不存在';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- =====================================================================================
|
||||
-- 完成提示
|
||||
-- =====================================================================================
|
||||
|
||||
DO $$
|
||||
BEGIN
|
||||
RAISE NOTICE '=======================================================';
|
||||
RAISE NOTICE '数据库状态检查完成!';
|
||||
RAISE NOTICE '=======================================================';
|
||||
RAISE NOTICE '请根据上述分析结果选择合适的升级脚本:';
|
||||
RAISE NOTICE '';
|
||||
RAISE NOTICE '• mall_alter_upgrade.sql - 完整升级(表+字段+索引+函数)';
|
||||
RAISE NOTICE '• mall_fields_only_upgrade.sql - 仅字段升级(最小化修改)';
|
||||
RAISE NOTICE '• mall_migration.sql - 完整建表(全新部署)';
|
||||
RAISE NOTICE '• mall_seo_security.sql - SEO优化和安全策略';
|
||||
RAISE NOTICE '';
|
||||
RAISE NOTICE '建议在生产环境执行前先在测试环境验证!';
|
||||
RAISE NOTICE '=======================================================';
|
||||
END $$;
|
||||
1180
mall_sql/tests/mock_data_insert.sql
Normal file
1180
mall_sql/tests/mock_data_insert.sql
Normal file
File diff suppressed because it is too large
Load Diff
113
mall_sql/tests/validation_test.sql
Normal file
113
mall_sql/tests/validation_test.sql
Normal file
@@ -0,0 +1,113 @@
|
||||
-- 商城数据库脚本验证测试
|
||||
-- 这个脚本用于验证数据库创建和模拟数据插入是否正常工作
|
||||
|
||||
-- 1. 检查必要的扩展是否可用
|
||||
DO $$
|
||||
BEGIN
|
||||
-- 检查 uuid-ossp 扩展
|
||||
IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'uuid-ossp') THEN
|
||||
RAISE NOTICE 'uuid-ossp 扩展未安装,请先执行: CREATE EXTENSION IF NOT EXISTS "uuid-ossp";';
|
||||
ELSE
|
||||
RAISE NOTICE 'uuid-ossp 扩展已安装 ✓';
|
||||
END IF;
|
||||
|
||||
-- 检查 pgcrypto 扩展
|
||||
IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'pgcrypto') THEN
|
||||
RAISE NOTICE 'pgcrypto 扩展未安装,请先执行: CREATE EXTENSION IF NOT EXISTS "pgcrypto";';
|
||||
ELSE
|
||||
RAISE NOTICE 'pgcrypto 扩展已安装 ✓';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- 2. 检查 ak_users 表是否存在
|
||||
DO $$
|
||||
BEGIN
|
||||
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'ak_users') THEN
|
||||
RAISE NOTICE 'ak_users 表已存在 ✓';
|
||||
|
||||
-- 检查 ak_users 表结构
|
||||
IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'ak_users' AND column_name = 'auth_id' AND data_type = 'uuid') THEN
|
||||
RAISE NOTICE 'ak_users.auth_id 字段类型正确 (uuid) ✓';
|
||||
ELSE
|
||||
RAISE NOTICE 'ak_users.auth_id 字段类型可能不正确,应为 uuid 类型';
|
||||
END IF;
|
||||
ELSE
|
||||
RAISE NOTICE 'ak_users 表不存在,需要先创建或从现有系统迁移';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- 3. 语法验证 - 测试典型的 RLS 策略语法
|
||||
DO $$
|
||||
BEGIN
|
||||
RAISE NOTICE '开始验证 RLS 策略语法...';
|
||||
|
||||
-- 测试 UUID 比较语法
|
||||
BEGIN
|
||||
-- 这个查询应该能正常解析
|
||||
PERFORM 1 WHERE '00000000-0000-0000-0000-000000000000'::uuid = '00000000-0000-0000-0000-000000000000'::uuid;
|
||||
RAISE NOTICE 'UUID 比较语法正确 ✓';
|
||||
EXCEPTION WHEN OTHERS THEN
|
||||
RAISE NOTICE 'UUID 比较语法错误: %', SQLERRM;
|
||||
END;
|
||||
|
||||
RAISE NOTICE 'RLS 策略语法验证完成 ✓';
|
||||
END $$;
|
||||
|
||||
-- 4. 检查商城表是否已存在
|
||||
DO $$
|
||||
DECLARE
|
||||
table_count INTEGER;
|
||||
mall_tables TEXT[] := ARRAY[
|
||||
'ml_user_profiles', 'ml_user_addresses', 'ml_shopping_cart',
|
||||
'ml_merchants', 'ml_categories', 'ml_products', 'ml_product_images',
|
||||
'ml_product_variants', 'ml_inventory', 'ml_orders', 'ml_order_items',
|
||||
'ml_reviews', 'ml_user_behavior', 'ml_promotions', 'ml_coupons',
|
||||
'ml_user_coupons', 'ml_delivery_info', 'ml_system_config'
|
||||
];
|
||||
tbl TEXT;
|
||||
BEGIN
|
||||
table_count := 0;
|
||||
|
||||
FOREACH tbl IN ARRAY mall_tables
|
||||
LOOP
|
||||
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = tbl) THEN
|
||||
table_count := table_count + 1;
|
||||
END IF;
|
||||
END LOOP;
|
||||
|
||||
RAISE NOTICE '商城表检查: %/% 个表已存在', table_count, array_length(mall_tables, 1);
|
||||
|
||||
IF table_count = 0 THEN
|
||||
RAISE NOTICE '商城表尚未创建,可以执行 complete_mall_database.sql';
|
||||
ELSIF table_count = array_length(mall_tables, 1) THEN
|
||||
RAISE NOTICE '所有商城表已存在 ✓';
|
||||
ELSE
|
||||
RAISE NOTICE '部分商城表已存在,建议检查现有表结构';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- 5. 模拟数据检查
|
||||
DO $$
|
||||
DECLARE
|
||||
user_count INTEGER;
|
||||
profile_count INTEGER;
|
||||
product_count INTEGER;
|
||||
BEGIN
|
||||
-- 检查用户数据
|
||||
SELECT COUNT(*) INTO user_count FROM public.ak_users WHERE username IN ('admin', 'merchant1', 'merchant2', 'customer1', 'customer2', 'customer3', 'driver1', 'driver2');
|
||||
RAISE NOTICE '测试用户数量: %', user_count;
|
||||
|
||||
-- 检查商城相关数据(如果表存在)
|
||||
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'ml_user_profiles') THEN
|
||||
SELECT COUNT(*) INTO profile_count FROM public.ml_user_profiles;
|
||||
RAISE NOTICE '用户档案数量: %', profile_count;
|
||||
END IF;
|
||||
|
||||
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'ml_products') THEN
|
||||
SELECT COUNT(*) INTO product_count FROM public.ml_products;
|
||||
RAISE NOTICE '商品数量: %', product_count;
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- 验证完成
|
||||
SELECT '数据库验证测试完成' AS status;
|
||||
113
mall_sql/tests/verify_mock_data_fix.sql
Normal file
113
mall_sql/tests/verify_mock_data_fix.sql
Normal file
@@ -0,0 +1,113 @@
|
||||
-- =================================================================-- 验证7:检查临时表是否已清理
|
||||
SELECT
|
||||
'临时表清理检查' as check_type,
|
||||
CASE
|
||||
WHEN EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'temp_user_ids')
|
||||
THEN '临时表仍存在'
|
||||
ELSE '临时表已清理'
|
||||
END as cleanup_status;
|
||||
|
||||
-- 验证8:检查配送任务分配逻辑
|
||||
SELECT
|
||||
'配送任务分配检查' as check_type,
|
||||
COUNT(DISTINCT dt.driver_id) as assigned_drivers,
|
||||
COUNT(*) as total_tasks,
|
||||
ROUND(AVG(tasks_per_driver.task_count), 2) as avg_tasks_per_driver
|
||||
FROM public.ml_delivery_tasks dt
|
||||
CROSS JOIN (
|
||||
SELECT driver_id, COUNT(*) as task_count
|
||||
FROM public.ml_delivery_tasks
|
||||
GROUP BY driver_id
|
||||
) as tasks_per_driver;============
|
||||
-- mock_data_insert.sql 修复验证脚本
|
||||
-- 用途: 验证修复后的模拟数据插入脚本是否能正常执行
|
||||
-- =====================================================================================
|
||||
|
||||
-- 验证1:检查商品价格数据完整性
|
||||
SELECT
|
||||
'商品价格检查' as check_type,
|
||||
COUNT(*) as total_products,
|
||||
COUNT(CASE WHEN base_price IS NULL THEN 1 END) as null_base_price_count,
|
||||
COUNT(CASE WHEN base_price > 0 THEN 1 END) as valid_price_count
|
||||
FROM public.ml_products;
|
||||
|
||||
-- 验证2:检查SKU价格数据完整性
|
||||
SELECT
|
||||
'SKU价格检查' as check_type,
|
||||
COUNT(*) as total_skus,
|
||||
COUNT(CASE WHEN price IS NULL THEN 1 END) as null_price_count,
|
||||
COUNT(CASE WHEN price > 0 THEN 1 END) as valid_price_count
|
||||
FROM public.ml_product_skus;
|
||||
|
||||
-- 验证3:测试商品-SKU价格查询逻辑
|
||||
SELECT
|
||||
'价格查询逻辑测试' as check_type,
|
||||
p.name as product_name,
|
||||
p.base_price,
|
||||
s.price as sku_price,
|
||||
COALESCE(s.price, p.base_price) as final_price,
|
||||
CASE
|
||||
WHEN s.price IS NOT NULL THEN 'SKU价格'
|
||||
ELSE '基础价格'
|
||||
END as price_source
|
||||
FROM public.ml_products p
|
||||
LEFT JOIN public.ml_product_skus s ON p.id = s.product_id
|
||||
ORDER BY p.name, s.sku_code
|
||||
LIMIT 10;
|
||||
|
||||
-- 验证4:检查订单商品价格是否存在NULL值
|
||||
SELECT
|
||||
'订单商品价格检查' as check_type,
|
||||
COUNT(*) as total_order_items,
|
||||
COUNT(CASE WHEN price IS NULL THEN 1 END) as null_price_count,
|
||||
COUNT(CASE WHEN price > 0 THEN 1 END) as valid_price_count,
|
||||
MIN(price) as min_price,
|
||||
MAX(price) as max_price
|
||||
FROM public.ml_order_items;
|
||||
|
||||
-- 验证5:检查订单关联的商家ID是否正确
|
||||
SELECT
|
||||
'订单商家关联检查' as check_type,
|
||||
COUNT(DISTINCT o.merchant_id) as unique_merchants,
|
||||
COUNT(*) as total_orders,
|
||||
COUNT(CASE WHEN u.role = 'merchant' THEN 1 END) as valid_merchant_orders
|
||||
FROM public.ml_orders o
|
||||
LEFT JOIN public.ak_users u ON o.merchant_id = u.id;
|
||||
|
||||
-- 验证6:检查配送任务唯一性
|
||||
SELECT
|
||||
'配送任务唯一性检查' as check_type,
|
||||
COUNT(*) as total_delivery_tasks,
|
||||
COUNT(DISTINCT order_id) as unique_orders,
|
||||
COUNT(*) - COUNT(DISTINCT order_id) as duplicate_order_count,
|
||||
CASE
|
||||
WHEN COUNT(*) = COUNT(DISTINCT order_id) THEN '✓ 无重复订单'
|
||||
ELSE '✗ 存在重复订单配送任务'
|
||||
END as uniqueness_status
|
||||
FROM public.ml_delivery_tasks;
|
||||
|
||||
-- 验证7:检查临时表是否已清理
|
||||
SELECT
|
||||
'临时表清理检查' as check_type,
|
||||
CASE
|
||||
WHEN EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'temp_user_ids')
|
||||
THEN '临时表仍存在'
|
||||
ELSE '临时表已清理'
|
||||
END as cleanup_status;
|
||||
|
||||
-- 输出总体验证结果
|
||||
DO $$
|
||||
BEGIN
|
||||
RAISE NOTICE '=======================================================';
|
||||
RAISE NOTICE '模拟数据插入脚本修复验证完成';
|
||||
RAISE NOTICE '=======================================================';
|
||||
RAISE NOTICE '请检查以上查询结果:';
|
||||
RAISE NOTICE '1. 商品和SKU价格应无NULL值';
|
||||
RAISE NOTICE '2. 订单商品价格应无NULL值';
|
||||
RAISE NOTICE '3. 订单应正确关联到商家用户';
|
||||
RAISE NOTICE '4. 配送任务应无重复订单';
|
||||
RAISE NOTICE '5. 临时表应已清理';
|
||||
RAISE NOTICE '=======================================================';
|
||||
RAISE NOTICE '如所有检查通过,说明修复有效';
|
||||
RAISE NOTICE '=======================================================';
|
||||
END $$;
|
||||
Reference in New Issue
Block a user