餐饮点餐系统SQL

DDL和DML

复制代码
/*
Navicat MySQL Data Transfer

Source Server         : Mylink
Source Server Version : 50726
Source Host           : localhost:3306
Source Database       : schooldb

Target Server Type    : MYSQL
Target Server Version : 50726
File Encoding         : 65001

Date: 2024-06-28 00:49:34
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `carts`
-- ----------------------------
DROP TABLE IF EXISTS `carts`;
CREATE TABLE `carts` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '购物车ID',
  `user_id` int(11) NOT NULL COMMENT '用户ID',
  `restaurant_id` int(11) NOT NULL COMMENT '餐厅ID',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `user_id` (`user_id`) USING BTREE,
  KEY `restaurant_id` (`restaurant_id`) USING BTREE,
  CONSTRAINT `carts_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
  CONSTRAINT `carts_ibfk_2` FOREIGN KEY (`restaurant_id`) REFERENCES `restaurants` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='购物车表';

-- ----------------------------
-- Records of carts
-- ----------------------------
INSERT INTO `carts` VALUES ('2', '1', '2');
INSERT INTO `carts` VALUES ('3', '3', '3');
INSERT INTO `carts` VALUES ('4', '5', '5');
INSERT INTO `carts` VALUES ('5', '4', '6');

-- ----------------------------
-- Table structure for `cart_items`
-- ----------------------------
DROP TABLE IF EXISTS `cart_items`;
CREATE TABLE `cart_items` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '购物车项ID',
  `cart_id` int(11) NOT NULL COMMENT '购物车ID',
  `dish_id` int(11) NOT NULL COMMENT '菜品ID',
  `quantity` int(11) NOT NULL COMMENT '数量',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `cart_id` (`cart_id`) USING BTREE,
  KEY `dish_id` (`dish_id`) USING BTREE,
  CONSTRAINT `cart_items_ibfk_1` FOREIGN KEY (`cart_id`) REFERENCES `carts` (`id`) ON DELETE CASCADE,
  CONSTRAINT `cart_items_ibfk_2` FOREIGN KEY (`dish_id`) REFERENCES `dishes` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='购物车项表';

-- ----------------------------
-- Records of cart_items
-- ----------------------------
INSERT INTO `cart_items` VALUES ('3', '2', '4', '1');
INSERT INTO `cart_items` VALUES ('4', '2', '5', '3');
INSERT INTO `cart_items` VALUES ('5', '3', '2', '4');

-- ----------------------------
-- Table structure for `dishes`
-- ----------------------------
DROP TABLE IF EXISTS `dishes`;
CREATE TABLE `dishes` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '菜品ID',
  `name` varchar(100) NOT NULL COMMENT '菜品名称',
  `description` text COMMENT '菜品描述',
  `price` decimal(10,2) NOT NULL COMMENT '菜品价格',
  `category_id` int(11) NOT NULL DEFAULT '1' COMMENT '所属分类ID',
  `restaurant_id` int(11) NOT NULL DEFAULT '1' COMMENT '所属餐厅ID',
  `stock_quantity` varchar(255) NOT NULL COMMENT '库存数量',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `category_id` (`category_id`) USING BTREE,
  KEY `restaurant_id` (`restaurant_id`) USING BTREE,
  CONSTRAINT `dishes_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `dish_categories` (`id`) ON DELETE CASCADE,
  CONSTRAINT `dishes_ibfk_2` FOREIGN KEY (`restaurant_id`) REFERENCES `restaurants` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='菜品表';

-- ----------------------------
-- Records of dishes
-- ----------------------------
INSERT INTO `dishes` VALUES ('1', '水煮鱼', '麻辣鲜香,回味无穷', '102.75', '1', '1', '190');
INSERT INTO `dishes` VALUES ('2', '宫保鸡丁', '色泽红亮,口感鲜美', '48.00', '1', '1', '250');
INSERT INTO `dishes` VALUES ('3', '麻婆豆腐', '麻辣可口,下饭佳品', '38.00', '1', '1', '140');
INSERT INTO `dishes` VALUES ('4', '白切鸡', '皮爽肉滑,鲜美无比', '68.00', '2', '2', '300');
INSERT INTO `dishes` VALUES ('5', '清蒸鲈鱼', '鲜嫩可口,营养丰富', '78.00', '2', '2', '420');
INSERT INTO `dishes` VALUES ('6', '菠萝咕噜肉', '酸甜可口,色泽诱人', '52.00', '2', '2', '480');
INSERT INTO `dishes` VALUES ('7', '剁椒鱼头', '香辣可口,回味无穷', '62.00', '3', '3', '500');
INSERT INTO `dishes` VALUES ('8', '辣椒炒肉', '香辣可口,下饭佳品', '42.00', '3', '3', '350');
INSERT INTO `dishes` VALUES ('9', '红烧肉', '肥而不腻,入口即化', '55.00', '3', '3', '250');
INSERT INTO `dishes` VALUES ('16', '大鱼头', null, '55.00', '1', '1', '100');

-- ----------------------------
-- Table structure for `dish_categories`
-- ----------------------------
DROP TABLE IF EXISTS `dish_categories`;
CREATE TABLE `dish_categories` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '菜品分类ID',
  `name` varchar(50) NOT NULL COMMENT '分类名称',
  `restaurant_id` int(11) NOT NULL COMMENT '所属餐厅ID',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `restaurant_id` (`restaurant_id`) USING BTREE,
  CONSTRAINT `dish_categories_ibfk_1` FOREIGN KEY (`restaurant_id`) REFERENCES `restaurants` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='菜品分类表';

-- ----------------------------
-- Records of dish_categories
-- ----------------------------
INSERT INTO `dish_categories` VALUES ('1', '川菜', '1');
INSERT INTO `dish_categories` VALUES ('2', '粤菜', '2');
INSERT INTO `dish_categories` VALUES ('3', '湘菜', '3');
INSERT INTO `dish_categories` VALUES ('4', '鲁菜', '1');
INSERT INTO `dish_categories` VALUES ('5', '苏菜', '2');
INSERT INTO `dish_categories` VALUES ('6', '浙菜', '3');

-- ----------------------------
-- Table structure for `orders`
-- ----------------------------
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID',
  `user_id` int(11) NOT NULL COMMENT '用户ID',
  `restaurant_id` int(11) DEFAULT NULL COMMENT '餐厅ID',
  `order_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '订单日期',
  `total_price` decimal(10,2) NOT NULL DEFAULT '1.00' COMMENT '订单总价',
  `status` enum('待支付','已支付','已取消','已完成') NOT NULL DEFAULT '待支付' COMMENT '订单状态',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `user_id` (`user_id`) USING BTREE,
  KEY `restaurant_id` (`restaurant_id`) USING BTREE,
  CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
  CONSTRAINT `orders_ibfk_2` FOREIGN KEY (`restaurant_id`) REFERENCES `restaurants` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='订单表';

-- ----------------------------
-- Records of orders
-- ----------------------------
INSERT INTO `orders` VALUES ('2', '3', '2', '2024-05-26 00:00:00', '95.00', '待支付');
INSERT INTO `orders` VALUES ('3', '2', '1', '2024-05-27 00:00:00', '75.08', '已完成');
INSERT INTO `orders` VALUES ('4', '5', '3', '2024-06-27 13:34:14', '100.00', '已支付');
INSERT INTO `orders` VALUES ('6', '4', '4', '2024-06-25 08:35:20', '74.00', '已完成');
INSERT INTO `orders` VALUES ('8', '1', '1', '2024-06-27 21:50:29', '116.00', '待支付');
INSERT INTO `orders` VALUES ('9', '1', '1', '2024-06-27 21:50:50', '116.00', '待支付');
INSERT INTO `orders` VALUES ('10', '1', '1', '2024-06-28 00:30:15', '205.50', '待支付');
INSERT INTO `orders` VALUES ('11', '1', '1', '2024-06-28 00:32:01', '205.50', '待支付');
INSERT INTO `orders` VALUES ('12', '2', null, '2024-06-28 00:37:55', '76.00', '待支付');
INSERT INTO `orders` VALUES ('13', '2', null, '2024-06-28 00:38:30', '76.00', '待支付');
INSERT INTO `orders` VALUES ('14', '2', null, '2024-06-28 00:39:34', '76.00', '待支付');
INSERT INTO `orders` VALUES ('15', '2', null, '2024-06-28 00:39:47', '76.00', '待支付');
INSERT INTO `orders` VALUES ('16', '2', null, '2024-06-28 00:47:01', '76.00', '待支付');

-- ----------------------------
-- Table structure for `order_items`
-- ----------------------------
DROP TABLE IF EXISTS `order_items`;
CREATE TABLE `order_items` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单项ID',
  `order_id` int(11) NOT NULL COMMENT '订单ID',
  `dish_id` int(11) NOT NULL COMMENT '菜品ID',
  `quantity` int(11) NOT NULL COMMENT '数量',
  `price_per_item` decimal(10,2) NOT NULL COMMENT '单价',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `order_id` (`order_id`) USING BTREE,
  KEY `dish_id` (`dish_id`) USING BTREE,
  CONSTRAINT `order_items_ibfk_1` FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`) ON DELETE CASCADE,
  CONSTRAINT `order_items_ibfk_2` FOREIGN KEY (`dish_id`) REFERENCES `dishes` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='订单项表';

-- ----------------------------
-- Records of order_items
-- ----------------------------
INSERT INTO `order_items` VALUES ('1', '2', '2', '2', '25.00');
INSERT INTO `order_items` VALUES ('3', '3', '6', '1', '35.00');
INSERT INTO `order_items` VALUES ('5', '4', '3', '5', '55.00');
INSERT INTO `order_items` VALUES ('6', '6', '1', '6', '43.00');
INSERT INTO `order_items` VALUES ('8', '8', '1', '2', '58.00');
INSERT INTO `order_items` VALUES ('9', '9', '1', '2', '58.00');
INSERT INTO `order_items` VALUES ('13', '10', '1', '2', '102.75');
INSERT INTO `order_items` VALUES ('14', '11', '1', '2', '102.75');
INSERT INTO `order_items` VALUES ('15', '12', '3', '2', '38.00');
INSERT INTO `order_items` VALUES ('16', '13', '3', '2', '38.00');
INSERT INTO `order_items` VALUES ('17', '14', '3', '2', '38.00');
INSERT INTO `order_items` VALUES ('18', '15', '3', '2', '38.00');
INSERT INTO `order_items` VALUES ('19', '16', '3', '2', '38.00');

-- ----------------------------
-- Table structure for `restaurants`
-- ----------------------------
DROP TABLE IF EXISTS `restaurants`;
CREATE TABLE `restaurants` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '餐厅ID',
  `name` varchar(100) NOT NULL COMMENT '餐厅名称',
  `address` varchar(255) NOT NULL COMMENT '餐厅地址',
  `opening_hours` varchar(50) DEFAULT NULL COMMENT '营业时间',
  `contact_number` varchar(20) DEFAULT NULL COMMENT '联系电话',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='餐厅表';

-- ----------------------------
-- Records of restaurants
-- ----------------------------
INSERT INTO `restaurants` VALUES ('1', '江湖酒楼', '京城大街1号', '09:00-22:00', '12345678');
INSERT INTO `restaurants` VALUES ('2', '美味轩', '长安路88号', '10:00-21:30', '87654321');
INSERT INTO `restaurants` VALUES ('3', '清风阁', '西湖路123号', '11:00-23:00', '98765432');
INSERT INTO `restaurants` VALUES ('4', '美食街', '西梅路45号', '14:00-18:00', '22651231');
INSERT INTO `restaurants` VALUES ('5', '饺子馆', '建设街23号', '8:00-11:30', '25641584');
INSERT INTO `restaurants` VALUES ('6', '河间驴肉火烧', '教育路47号', '13:00-19:00', '27512975');

-- ----------------------------
-- Table structure for `users`
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `gender` enum('男','女') NOT NULL COMMENT '性别',
  `phone` varchar(20) DEFAULT NULL COMMENT '电话号码',
  `balance` varchar(255) DEFAULT '钱包余额',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `username` (`username`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='用户表';

-- ----------------------------
-- Records of users
-- ----------------------------
INSERT INTO `users` VALUES ('1', '赵一', '男', '154786482', '600');
INSERT INTO `users` VALUES ('2', '钱二', '男', '154961482', '650');
INSERT INTO `users` VALUES ('3', '张三', '女', '121876879', '450');
INSERT INTO `users` VALUES ('4', '李四', '男', '187597326', '470');
INSERT INTO `users` VALUES ('5', '王五', '女', '145745468', '550');

-- ----------------------------
-- Procedure structure for `create_order_infos`
-- ----------------------------
DROP PROCEDURE IF EXISTS `create_order_infos`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `create_order_infos`(
    IN in_user_id INT,
    IN in_dish_id INT,
    IN in_quantity INT
)
BEGIN
    -- 注释:声明变量用于存储相关信息
    DECLARE dish_price DECIMAL(10, 2);
    DECLARE total_price DECIMAL(10, 2);
    DECLARE order_id INT;
    DECLARE restaurant_id INT;

    -- 注释:获取菜品价格
    SELECT price INTO dish_price FROM dishes WHERE id = in_dish_id;

    -- 注释:计算订单总价
    SET total_price = dish_price * in_quantity;

    -- 注释:获取菜品所属餐厅 ID
    SELECT restaurant_id INTO restaurant_id FROM dishes WHERE id = in_dish_id;

    -- 注释:插入订单信息到订单表
    INSERT INTO orders (user_id, restaurant_id, order_date, total_price, status)
    VALUES (in_user_id, restaurant_id, NOW(), total_price, '待支付');

    -- 注释:获取生成的订单 ID
    SET order_id = LAST_INSERT_ID();

    -- 注释:插入订单详情信息到订单详情表
    INSERT INTO order_items (order_id, dish_id, quantity, price_per_item)
    VALUES (order_id, in_dish_id, in_quantity, dish_price);

    -- 注释:更新商品表的库存数量
    UPDATE dishes SET stock_quantity = stock_quantity - in_quantity WHERE id = in_dish_id;

END
;;
DELIMITER ;
DROP TRIGGER IF EXISTS `trg_check_dish_price_update`;
DELIMITER ;;
CREATE TRIGGER `trg_check_dish_price_update` BEFORE UPDATE ON `dishes` FOR EACH ROW BEGIN
    DECLARE original_price DECIMAL(10,2);
    DECLARE new_price DECIMAL(10,2);
    DECLARE diff DECIMAL(10,2);

    SET original_price = OLD.price;
    SET new_price = NEW.price;

    -- 计算价格差是否超过10%
    SET diff = ABS(new_price - original_price) / original_price;

    IF diff > 0.1 THEN
        SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = '商品售价上下浮动超过10%的限制!';
    END IF;
END
;;
DELIMITER ;
DROP TRIGGER IF EXISTS `trg_delete_order_items_before_order`;
DELIMITER ;;
CREATE TRIGGER `trg_delete_order_items_before_order` BEFORE DELETE ON `orders` FOR EACH ROW BEGIN
    DELETE FROM order_items WHERE order_id = OLD.id;
END
;;
DELIMITER ;

ER图

触发器和存储过程

复制代码
DELIMITER $$
CREATE TRIGGER trg_check_price_change
BEFORE UPDATE ON dishes
FOR EACH ROW
BEGIN
    DECLARE old_price DECIMAL(10,2);
    DECLARE new_price DECIMAL(10,2);
    DECLARE price_change DECIMAL(10,2);

    -- 获取新旧价格
    SET old_price = OLD.price;
    SET new_price = NEW.price;

    -- 计算价格变化百分比
    IF (new_price <> 0) THEN
        SET price_change = (new_price - old_price) / old_price * 100;
    ELSE
        -- 如果新价格为0,则不允许更新
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '新价格不能为0。';
    END IF;

    -- 检查价格变动是否超过10%
    IF (price_change > 10 OR price_change < -10) THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '商品售价上下浮动不能超过10%。';
    END IF;
END;
$$
DELIMITER ;
DELIMITER //
CREATE TRIGGER trg_cascade_delete_order_items
AFTER DELETE ON orders
FOR EACH ROW
BEGIN
    DELETE FROM order_items WHERE order_id = OLD.id;
END;
//
DELIMITER ;

DELETE FROM `order` WHERE `order_id` = 刚才添加的id号;


-- 插入测试数据:
insert into dishes(`name`,price,stock_quantity) VALUES ( '大鱼头',55.00,100);
-- 正常更新(未超10%)
UPDATE dishes set price =8.00 WHERE `name`='大鱼头';  -- 触发错误

DELIMITER //

CREATE PROCEDURE create_order_infos(
    IN in_user_id INT,
    IN in_dish_id INT,
    IN in_quantity INT
)
BEGIN
    -- 注释:声明变量用于存储相关信息
    DECLARE dish_price DECIMAL(10, 2);
    DECLARE total_price DECIMAL(10, 2);
    DECLARE order_id INT;
    DECLARE restaurant_id INT;

    -- 注释:获取菜品价格
    SELECT price INTO dish_price FROM dishes WHERE id = in_dish_id;

    -- 注释:计算订单总价
    SET total_price = dish_price * in_quantity;

    -- 注释:获取菜品所属餐厅 ID
    SELECT restaurant_id INTO restaurant_id FROM dishes WHERE id = in_dish_id;

    -- 注释:插入订单信息到订单表
    INSERT INTO orders (user_id, restaurant_id, order_date, total_price, status)
    VALUES (in_user_id, restaurant_id, NOW(), total_price, '待支付');

    -- 注释:获取生成的订单 ID
    SET order_id = LAST_INSERT_ID();

    -- 注释:插入订单详情信息到订单详情表
    INSERT INTO order_items (order_id, dish_id, quantity, price_per_item)
    VALUES (order_id, in_dish_id, in_quantity, dish_price);

    -- 注释:更新商品表的库存数量
    UPDATE dishes SET stock_quantity = stock_quantity - in_quantity WHERE id = in_dish_id;

END //

DELIMITER ;
CALL create_order_infos(2, 3, 2);
相关推荐
alexhilton1 小时前
为什么你的App总是忘记所有事情
android·kotlin·android jetpack
星辰离彬1 小时前
Java 与 MySQL 性能优化:Java应用中MySQL慢SQL诊断与优化实战
java·后端·sql·mysql·性能优化
zhuiQiuMX3 小时前
脉脉maimai面试死亡日记
数据仓库·sql·面试
AirDroid_cn4 小时前
OPPO手机怎样被其他手机远程控制?两台OPPO手机如何相互远程控制?
android·windows·ios·智能手机·iphone·远程工作·远程控制
尊治4 小时前
手机电工仿真软件更新了
android
xiangzhihong87 小时前
使用Universal Links与Android App Links实现网页无缝跳转至应用
android·ios
车载应用猿8 小时前
基于Android14的CarService 启动流程分析
android
没有了遇见8 小时前
Android 渐变色实现总结
android
GEEK零零七9 小时前
Leetcode 1070. 产品销售分析 III
sql·算法·leetcode
雨白11 小时前
Jetpack系列(四):精通WorkManager,让后台任务不再失控
android·android jetpack