![enter image description here](https://i.stack.imgur.com/YKl75.png)
Я хочу рассказать мне, как создать триггер, который позволяет мне обновлять запас ингредиентов, из которых состоит продукт, на основе рецепта, в котором он содержится.
DELIMITER //
CREATE TRIGGER tr_updStockIngredients AFTER INSERT ON detail_orders
FOR EACH ROW
BEGIN
DECLARE ingredient_id INT;
DECLARE quantity DECIMAL;
SELECT recp.ingredient_id, recp.quantity INTO ingredient_id, quantity
FROM detail_orders deor, recipes recp
WHERE deor.food_id=NEW.food_id //5
AND recp.food_id = deor.food_id;
UPDATE ingredients SET stock_per_measure = stock_per_measure - quantity
WHERE ingredients.id = ingredient_id;
END
//
DELIMITER ;
моя ошибка:
"SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1172 Результат состоит из более чем одной строки (SQL: вставить в detail_orders (order_id, комментарий, food_id, количество, цена, updated_at, create_at) значения (47,?, 1, 1, 5000.00, 2020-04-09 22:00:12, 2020-04-09 22:00:12)) "
CREATE TABLE `orders` (
`id` bigint(20) UNSIGNED NOT NULL,
`order_number` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
`status` int(11) NOT NULL,
`user_id` bigint(20) UNSIGNED NOT NULL,
`board_id` bigint(20) UNSIGNED NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL,
`sale_id` bigint(20) UNSIGNED DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `detail_orders` (
`id` bigint(20) UNSIGNED NOT NULL,
`comment` varchar(150) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`quantity` int(11) NOT NULL,
`price` decimal(11,2) NOT NULL,
`discount` decimal(11,2) DEFAULT NULL,
`order_id` bigint(20) UNSIGNED NOT NULL,
`food_id` bigint(20) UNSIGNED DEFAULT NULL,
`combo_id` bigint(20) UNSIGNED DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `foods` (
`id` bigint(20) UNSIGNED NOT NULL,
`name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`price` decimal(8,2) NOT NULL,
`image` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL,
`category_id` bigint(20) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `recipes` (
`id` bigint(20) UNSIGNED NOT NULL,
`quantity` decimal(11,2) NOT NULL,
`ingredient_id` bigint(20) UNSIGNED NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`food_id` bigint(20) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `ingredients` (
`id` bigint(20) UNSIGNED NOT NULL,
`name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
`sale_price` decimal(11,2) NOT NULL,
`stock_per_measure` int(11) NOT NULL,
`packing` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
`measure` varchar(15) COLLATE utf8mb4_unicode_ci NOT NULL,
`quantity_per_measure` int(11) NOT NULL,
`status` tinyint(1) NOT NULL DEFAULT '1',
`category_id` bigint(20) UNSIGNED NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
запрос
SELECT foods.name,
recipes.quantity as recipe_quantity,
recipes.ingredient_id as recipe_ingredient,
ingredients.name as ingredient_name,
ingredients.stock_per_measure as ingredient_stock
FROM foods, recipes,ingredients
WHERE foods.id =1
AND foods.id = recipes.food_id
AND ingredients.id = recipes.ingredient_id
результат
name | recipe_quantity| recipe_ingredient|ingredient_name|ingredient_stock
Burger |2 |1 |bread |180
Burger |1 |2 |letucce |2000
Burger |1 |3 |tomato |2000
Burger |100 |4 |meat |2000