sql
This commit is contained in:
+65
-19
@@ -10,13 +10,17 @@ CREATE TABLE IF NOT EXISTS `categories` (
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品分类表';
|
||||
|
||||
ALTER TABLE `categories` ADD COLUMN IF NOT EXISTS `color` varchar(20) DEFAULT '#1890ff' COMMENT '分类颜色';
|
||||
-- 兼容 MySQL < 8.0.29:基于 information_schema 判断后再 ALTER
|
||||
SET @col_exists = (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'categories' AND COLUMN_NAME = 'color');
|
||||
SET @sql = IF(@col_exists = 0, 'ALTER TABLE `categories` ADD COLUMN `color` varchar(20) DEFAULT ''#1890ff'' COMMENT ''分类颜色''', 'SELECT 1');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `goods` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(200) NOT NULL COMMENT '商品名称',
|
||||
`price` decimal(10,2) NOT NULL COMMENT '售价',
|
||||
`original_price` decimal(10,2) DEFAULT NULL COMMENT '原价',
|
||||
`cost_price` decimal(10,2) DEFAULT 0 COMMENT '成本价',
|
||||
`unit` varchar(20) DEFAULT '件' COMMENT '单位',
|
||||
`category_id` int(11) DEFAULT NULL COMMENT '分类ID',
|
||||
`images` text COMMENT '图片JSON',
|
||||
@@ -25,11 +29,17 @@ CREATE TABLE IF NOT EXISTS `goods` (
|
||||
`is_hot` tinyint(1) DEFAULT 0 COMMENT '是否热销',
|
||||
`is_new` tinyint(1) DEFAULT 0 COMMENT '是否新品',
|
||||
`pricing_type` tinyint(1) DEFAULT 1 COMMENT '定价类型 1-按件 2-按重量',
|
||||
`goods_no` varchar(64) DEFAULT '' COMMENT '商品货号',
|
||||
`barcode` varchar(64) DEFAULT '' COMMENT '商品条码',
|
||||
`is_on_sale` tinyint(1) DEFAULT 1 COMMENT '是否上架 1-上架 0-下架',
|
||||
`description` text COMMENT '商品描述',
|
||||
`remark` varchar(500) DEFAULT '' COMMENT '备注',
|
||||
`created_at` timestamp DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `category_id` (`category_id`),
|
||||
KEY `idx_barcode` (`barcode`),
|
||||
KEY `idx_goods_no` (`goods_no`),
|
||||
CONSTRAINT `goods_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品表';
|
||||
|
||||
@@ -188,31 +198,55 @@ CREATE TABLE IF NOT EXISTS `points_goods` (
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='积分商品表';
|
||||
|
||||
-- 订单表索引:按状态筛选、按时间排序
|
||||
ALTER TABLE `orders` ADD INDEX IF NOT EXISTS `idx_orders_status` (`status`);
|
||||
ALTER TABLE `orders` ADD INDEX IF NOT EXISTS `idx_orders_created_at` (`created_at`);
|
||||
SET @idx_exists = (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'orders' AND INDEX_NAME = 'idx_orders_status');
|
||||
SET @sql = IF(@idx_exists = 0, 'ALTER TABLE `orders` ADD INDEX `idx_orders_status` (`status`)', 'SELECT 1');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @idx_exists = (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'orders' AND INDEX_NAME = 'idx_orders_created_at');
|
||||
SET @sql = IF(@idx_exists = 0, 'ALTER TABLE `orders` ADD INDEX `idx_orders_created_at` (`created_at`)', 'SELECT 1');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 商品表索引:热销/新品筛选、名称搜索
|
||||
ALTER TABLE `goods` ADD INDEX IF NOT EXISTS `idx_goods_is_hot` (`is_hot`);
|
||||
ALTER TABLE `goods` ADD INDEX IF NOT EXISTS `idx_goods_is_new` (`is_new`);
|
||||
ALTER TABLE `goods` ADD INDEX IF NOT EXISTS `idx_goods_name` (`name`(100));
|
||||
SET @idx_exists = (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'goods' AND INDEX_NAME = 'idx_goods_is_hot');
|
||||
SET @sql = IF(@idx_exists = 0, 'ALTER TABLE `goods` ADD INDEX `idx_goods_is_hot` (`is_hot`)', 'SELECT 1');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @idx_exists = (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'goods' AND INDEX_NAME = 'idx_goods_is_new');
|
||||
SET @sql = IF(@idx_exists = 0, 'ALTER TABLE `goods` ADD INDEX `idx_goods_is_new` (`is_new`)', 'SELECT 1');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @idx_exists = (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'goods' AND INDEX_NAME = 'idx_goods_name');
|
||||
SET @sql = IF(@idx_exists = 0, 'ALTER TABLE `goods` ADD INDEX `idx_goods_name` (`name`(100))', 'SELECT 1');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 商品表新增上下架字段
|
||||
ALTER TABLE `goods` ADD COLUMN IF NOT EXISTS `is_on_sale` tinyint(1) DEFAULT 1 COMMENT '是否上架 1-上架 0-下架';
|
||||
ALTER TABLE `goods` ADD COLUMN IF NOT EXISTS `cost_price` decimal(10,2) DEFAULT 0.00 COMMENT '进价';
|
||||
SET @col_exists = (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'goods' AND COLUMN_NAME = 'is_on_sale');
|
||||
SET @sql = IF(@col_exists = 0, 'ALTER TABLE `goods` ADD COLUMN `is_on_sale` tinyint(1) DEFAULT 1 COMMENT ''是否上架 1-上架 0-下架''', 'SELECT 1');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @col_exists = (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'goods' AND COLUMN_NAME = 'cost_price');
|
||||
SET @sql = IF(@col_exists = 0, 'ALTER TABLE `goods` ADD COLUMN `cost_price` decimal(10,2) DEFAULT 0.00 COMMENT ''进价''', 'SELECT 1');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 商品表全文索引:关键词搜索加速 (MySQL 5.7+/8.0)
|
||||
-- 注意:FULLTEXT 需 MyISAM 或 InnoDB 5.6+;若不支持会被忽略
|
||||
ALTER TABLE `goods` ADD FULLTEXT INDEX IF NOT EXISTS `ft_goods_name_desc` (`name`, `description`);
|
||||
SET @idx_exists = (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'goods' AND INDEX_NAME = 'ft_goods_name_desc');
|
||||
SET @sql = IF(@idx_exists = 0, 'ALTER TABLE `goods` ADD FULLTEXT INDEX `ft_goods_name_desc` (`name`, `description`)', 'SELECT 1');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 分类表索引:按排序字段排序
|
||||
ALTER TABLE `categories` ADD INDEX IF NOT EXISTS `idx_categories_sort_order` (`sort_order`);
|
||||
SET @idx_exists = (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'categories' AND INDEX_NAME = 'idx_categories_sort_order');
|
||||
SET @sql = IF(@idx_exists = 0, 'ALTER TABLE `categories` ADD INDEX `idx_categories_sort_order` (`sort_order`)', 'SELECT 1');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 积分记录表索引:按类型筛选
|
||||
ALTER TABLE `points_logs` ADD INDEX IF NOT EXISTS `idx_points_logs_type` (`type`);
|
||||
SET @idx_exists = (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'points_logs' AND INDEX_NAME = 'idx_points_logs_type');
|
||||
SET @sql = IF(@idx_exists = 0, 'ALTER TABLE `points_logs` ADD INDEX `idx_points_logs_type` (`type`)', 'SELECT 1');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 采购单表索引:按状态筛选、按时间排序
|
||||
ALTER TABLE `purchases` ADD INDEX IF NOT EXISTS `idx_purchases_status` (`status`);
|
||||
ALTER TABLE `purchases` ADD INDEX IF NOT EXISTS `idx_purchases_created_at` (`created_at`);
|
||||
SET @idx_exists = (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'purchases' AND INDEX_NAME = 'idx_purchases_status');
|
||||
SET @sql = IF(@idx_exists = 0, 'ALTER TABLE `purchases` ADD INDEX `idx_purchases_status` (`status`)', 'SELECT 1');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @idx_exists = (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'purchases' AND INDEX_NAME = 'idx_purchases_created_at');
|
||||
SET @sql = IF(@idx_exists = 0, 'ALTER TABLE `purchases` ADD INDEX `idx_purchases_created_at` (`created_at`)', 'SELECT 1');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 购物车表
|
||||
CREATE TABLE IF NOT EXISTS `carts` (
|
||||
@@ -233,8 +267,12 @@ CREATE TABLE IF NOT EXISTS `carts` (
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='购物车表';
|
||||
|
||||
-- 购物车表索引
|
||||
ALTER TABLE `carts` ADD INDEX IF NOT EXISTS `idx_carts_user_id` (`user_id`);
|
||||
ALTER TABLE `carts` ADD INDEX IF NOT EXISTS `idx_carts_selected` (`selected`);
|
||||
SET @idx_exists = (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'carts' AND INDEX_NAME = 'idx_carts_user_id');
|
||||
SET @sql = IF(@idx_exists = 0, 'ALTER TABLE `carts` ADD INDEX `idx_carts_user_id` (`user_id`)', 'SELECT 1');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @idx_exists = (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'carts' AND INDEX_NAME = 'idx_carts_selected');
|
||||
SET @sql = IF(@idx_exists = 0, 'ALTER TABLE `carts` ADD INDEX `idx_carts_selected` (`selected`)', 'SELECT 1');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 退款表
|
||||
CREATE TABLE IF NOT EXISTS `refunds` (
|
||||
@@ -258,8 +296,12 @@ CREATE TABLE IF NOT EXISTS `refunds` (
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='退款申请表';
|
||||
|
||||
-- 退款表索引
|
||||
ALTER TABLE `refunds` ADD INDEX IF NOT EXISTS `idx_refunds_status` (`status`);
|
||||
ALTER TABLE `refunds` ADD INDEX IF NOT EXISTS `idx_refunds_created_at` (`created_at`);
|
||||
SET @idx_exists = (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'refunds' AND INDEX_NAME = 'idx_refunds_status');
|
||||
SET @sql = IF(@idx_exists = 0, 'ALTER TABLE `refunds` ADD INDEX `idx_refunds_status` (`status`)', 'SELECT 1');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @idx_exists = (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'refunds' AND INDEX_NAME = 'idx_refunds_created_at');
|
||||
SET @sql = IF(@idx_exists = 0, 'ALTER TABLE `refunds` ADD INDEX `idx_refunds_created_at` (`created_at`)', 'SELECT 1');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 首页分类配置表
|
||||
CREATE TABLE IF NOT EXISTS `home_categories` (
|
||||
@@ -326,6 +368,10 @@ CREATE TABLE IF NOT EXISTS `ai_cache` (
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='AI 响应缓存';
|
||||
|
||||
-- 迁移:order_items.order_id 从 int 改为 varchar(64),与 orders.id (varchar(50)) 保持一致
|
||||
ALTER TABLE `order_items` DROP FOREIGN KEY IF EXISTS `order_items_ibfk_1`;
|
||||
SET @fk_exists = (SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = DATABASE() AND TABLE_NAME = 'order_items' AND CONSTRAINT_NAME = 'order_items_ibfk_1');
|
||||
SET @sql = IF(@fk_exists > 0, 'ALTER TABLE `order_items` DROP FOREIGN KEY `order_items_ibfk_1`', 'SELECT 1');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
ALTER TABLE `order_items` MODIFY COLUMN `order_id` varchar(64) NOT NULL COMMENT '订单ID';
|
||||
ALTER TABLE `order_items` ADD CONSTRAINT `order_items_ibfk_1` FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`) ON DELETE CASCADE;
|
||||
SET @fk_exists = (SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = DATABASE() AND TABLE_NAME = 'order_items' AND CONSTRAINT_NAME = 'order_items_ibfk_1');
|
||||
SET @sql = IF(@fk_exists = 0, 'ALTER TABLE `order_items` ADD CONSTRAINT `order_items_ibfk_1` FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`) ON DELETE CASCADE', 'SELECT 1');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
Reference in New Issue
Block a user