餐饮点餐系统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);
相关推荐
六月的雨__41 分钟前
二手物品交易小程序的设计
java·sql·学习·小程序
子衿JDD1 小时前
【论文阅读】-- Strscope:不规则测量的时间序列数据的多尺度可视化
论文阅读·信息可视化
dot.Net安全矩阵2 小时前
.NET 漏洞情报 | 某整合管理平台SQL注入
数据库·sql·安全·矩阵·.net
都适、隶仁ミ2 小时前
SQL注入工具Sqlmap
linux·网络·数据库·sql·安全·网络安全·系统安全
H1002 小时前
Kotlin中对空的很多处理
android·开发语言·kotlin
松仔log2 小时前
Kotlin基础——异步和并发
android·开发语言·kotlin
H1002 小时前
Kotlin中的关键字
android·kotlin
测试开发-学习笔记2 小时前
sql查询练习
数据库·sql
苏呆仔3 小时前
如何使用PHP根据输入文字动态调整图片尺寸?
android·开发语言·php
花生君5 小时前
如何在Android Studio中查看APP客户端日志
android·ide·android studio