создание триггера, в котором предложение зависит от 3 таблиц?

#mysql #sql #triggers #nested

#mysql #sql #триггеры #вложенный

Вопрос:

У меня проблема с этим триггером, который я пытаюсь создать. Это для проекта колледжа, поэтому его нужно выполнить с помощью триггера!

У меня есть 3 таблицы, которые включают триггер. Customer_order, product_customer_order и product_branch_stock (их содержимое и назначение перечислены ниже). Я также включил код, который я использую, хотя я перепробовал так много разных его вариантов, которые не сработали, это последний.

Я могу заставить триггер работать, чтобы уменьшить запас в таблице product_branch_stock в соответствии только с branch_id на вставке customer_order, но он не может учитывать product_id, который находится в другой таблице. Итак, мне также очень интересно, как я могу включить эту другую таблицу в триггер?

Дизайн может быть не самым лучшим, но имейте в виду, что на данный момент я занимаюсь sql всего около 6 недель, и мне еще многому предстоит научиться! Итак, любая помощь, которую вы могли бы оказать, была бы очень признательна! Мой проект должен быть завершен в пятницу!

РЕДАКТИРОВАТЬ: я добавил таблицы с соответствующими столбцами и примерами строк ниже

Этот триггер, который я пытаюсь создать (возможно, вложенный триггер), должен выполнять следующее, когда строка вставляется в таблицу customer_order

  • вставить строку (любые значения) в product_customer_order
  • обновите столбец product_branch_stock stock, убрав из него количество в таблице customer_order
  • Делайте это только в строках, ГДЕ новый branch_id (из вставки в заказе клиента) равен branch_id в product_branch_stock И где новый product_id (из инициированной вставки в product_customer_order) равен
    product_id в product_branch_stock.
  • customer_order (customer_order_id,order_time, order_date, username, branch_id)
  • product_customer_order(customer_order_id, product_id, quantity,) (Это посредник между таблицей product и customer_order, поскольку существует связь «многие ко многим»).
  • product_branch_stock (product_id, branch_id, stock) Это таблица, которую я создал в попытке иметь возможность отслеживать запасы каждого продукта в каждой отдельной отрасли)
     create schema test;
    use test;
    
    CREATE TABLE customer_order (
    customer_order_id INT NOT NULL AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,    # foreign key
    branch_id INT NOT NULL,           # foreign key
    PRIMARY KEY (customer_order_id)
    );
    
    INSERT INTO customer_order (customer_order_id, username, branch_id)
    VALUES  ('1','Paddytheboi101', 2 );
    
    INSERT INTO customer_order (customer_order_id, username, branch_id)
    VALUES  ('2','LuCkYmIkE', 1 );  
    
    INSERT INTO customer_order (customer_order_id, username, branch_id)
    VALUES  ('3','DutchDefence',  1 );
    
    
    
    #intermediary table due to many to many relationship - order can have #multiple products, product can be on multiple orders
    
    CREATE TABLE product_customer_order (
    customer_order_id INT NOT NULL AUTO_INCREMENT, # primary and foreign key
    product_id INT NOT NULL,   # primary and foreign key 
    quantity INT NOT NULL,
    PRIMARY KEY (customer_order_id, product_id),
    FOREIGN KEY (customer_order_id) REFERENCES customer_order (customer_order_id)
    );
    
    INSERT INTO product_customer_order (customer_order_id, product_id, quantity)
    VALUES ('1', '8', '1');
    
    INSERT INTO product_customer_order (customer_order_id, product_id, quantity)
    VALUES ('2', '21', '4');
    
    INSERT INTO product_customer_order (customer_order_id, product_id, quantity)
    VALUES ('3', '32', '3');
    
    
    CREATE TABLE product_branch_stock (
    product_id INT NOT NULL,   # foreign key
    branch_id INT NOT NULL,    # foreign key
    stock INT NOT NULL,
    PRIMARY KEY (branch_id, product_id)
    );
    
    INSERT INTO product_branch_stock (product_id, branch_id, stock)
    VALUES (8,2,10);
    INSERT INTO product_branch_stock (product_id, branch_id, stock)
    VALUES (21,1,10);
    INSERT INTO product_branch_stock (product_id, branch_id, stock)
    VALUES (32,1,10);
 
 DROP TRIGGER IF EXISTS X;
CALL DELIMITER //

CREATE TRIGGER X
AFTER INSERT ON customer_order
FOR EACH ROW
BEGIN

INSERT INTO product_customer_order (product_id, quantity)
VALUES (7, 2);

UPDATE product_branch_stock AS pbs
SET pbs.stock = pbs.stock - new.product_customer_order.quantity
WHERE new.branch_id = pbs.branch_id AND
product_customer_order.product_id = pbs.product_id;

END//
 

Комментарии:

1. Вы можете выбирать из другой таблицы в триггере и извлекать результаты в курсор или другие переменные.

2. Пожалуйста, предоставьте: СОЗДАТЬ ТАБЛИЦУ для всех 3 таблиц (столбцы, не связанные с процессом, и все неуникальные индексы, за исключением необходимых для FKS между этими таблицами, могут быть пропущены); некоторые примеры данных для этих таблиц (достаточно 3-5 строк) в качестве INSERT INTO; запрос, в который вставляются данные customer_order (который инициализирует процесс) и желаемые данные конечных таблиц (в виде форматированного текста табличного типа). Попробуйте сделать все числовые значения уникальными (т. Е. Каждое значение может быть получено из начальных значений только одним способом, если это возможно).

3. @Akina Во-первых, большое спасибо, что рассмотрели мою проблему! Я выполнил команды create table с некоторыми фиктивными данными, как вы просили. Должно работать нормально, я протестировал его в «тестовой» схеме в mysql. Фиктивные данные выровнены во всех таблицах, поэтому все они имеют совпадающие внешние ключи и т. Д. Я пропустил большинство констант внешнего ключа (они также связаны с другими нерелевантными таблицами в моем проекте, поэтому, когда я скопировал и вставил, это не позволило бы мне сначала обновить дочернюю таблицу без родительской таблицы, естественно.

4. Также я понимаю, что мой код выглядит довольно беспорядочно по сравнению с кодом триггера, он выглядит как тот же тип теста, что и текст комментария / вопроса. Есть ли какой-нибудь способ изменить его, чтобы он выглядел как код триггера? Например, где он цветной и все такое? Извините, полный новичок с переполнением стека тоже.