2014-02-01 4 views
0

Im работает на небольшой pos-системе на основе php и sqlite3. БД содержит таблицу для заказов и таблицу, которая содержит связанные с продуктами (внешний ключ) в таблице заказов. В таблицах заказов есть строка, которая показывает итоговый объем, который вычисляется через PHP. Это сумма всех добавленных продуктов. Каждый раз, когда я добавляю или удаляю продукт, мне также нужно обновить таблицу заказов.Sqlite: обновление разных строк на разных таблицах при удалении

Мой вопрос: возможно ли синхронизировать ценовой ряд цены заказов с ценой только добавленных прорываний в sqlite, так что заказы-> цена - это просто ссылка на сумму (related_products-> цена)?

+1

Почему вы не можете просто вычислить сумму на лету, когда вам это нужно? –

ответ

1

Можно ли синхронизировать прайс-строку заказов-table-> цена с суммой цен добавляемых prorducts в SQLite только

ли вы имеете в виду что-то вроде этого?

CREATE TRIGGER tg_item_insert 
AFTER INSERT ON order_items 
FOR EACH ROW 
BEGIN 
    UPDATE orders 
    SET price = price + NEW.qty * NEW.price 
    WHERE order_id = NEW.order_id; 
END; 

CREATE TRIGGER tg_item_delete 
AFTER DELETE ON order_items 
FOR EACH ROW 
BEGIN 
    UPDATE orders 
    SET price = price - OLD.qty * OLD.price 
    WHERE order_id = OLD.order_id; 
END; 

CREATE TRIGGER tg_item_update 
AFTER UPDATE ON order_items 
FOR EACH ROW 
BEGIN 
    UPDATE orders 
    SET price = price - OLD.qty * OLD.price + NEW.qty * NEW.price 
    WHERE order_id = NEW.order_id; 
END; 

Вот SQLFiddle демо

0

Спасибо за ваш ответ и sqlfiddle ссылку. Но это слишком сильно замедлит работу системы. мне нужно что-то вроде следующую логику как trigger_function

CREATE TRIGGER tg_item_insert 
AFTER INSERT ON order_items 
BEGIN 
    UPDATE orders 
    SET price = (SELECT sum(price) FROM order_items WHERE order_id= ---> .last_inserted_order_id <----) 
    WHERE order_id = ---> .last_inserted_order_id <----; 
END; 
// 

Можно получить и использовать last_rowid в триггер-функции?

+0

Ваш псевдокод ** путь ** медленнее, чем я предложил в своем ответе, потому что мой код добавляет и вычитает относительные суммы (от) всего и не включает оператор SELECT с помощью агрегатной функции. Это так быстро, что вы можете получить. SQLite поддерживает только триггеры на основе строк, поэтому кусок кода в триггере будет выполняться для каждой затронутой строки. Более того, нет понятия последнего вставленного идентификатора на заказ, если это то, что вы имеете в виду. Это логическая абстракция уровня приложения. БД не знает, что было последним order_item за введенный заказ. – peterm

Смежные вопросы