2014-10-07 2 views
0

Я разрабатываю Точки продаж системы, где:Наличие Автоинкрементных на колонке в контексте другого столбца

  1. Пользователь может добавлять элементы, которые собираются продать.
  2. Каждая продажа Операция генерировать рецепт, который запоминание продаваемого предмета
  3. Приложение делает серийный номер для каждого продаваемого продукта, который увеличивается на единицу каждый раз, когда продукт продается.
    Например: я продал продукт A & B, поэтому каждый из них один получить серийный 1. Затем я продал продукт А снова, поэтому он должен получить серийный 2, а серийный номер B еще 1.

I не получил четкое представление о том, как осуществить это, но это дизайн схемы я сделал:

Recipe Table fields : id,created_at 
Items Table fields : id,name,price 
Association Table fields : id, Recipe_id, item_id, item_serial 

Интересно, смогу ли я сделать item_serial увеличение авто в зависимости от item_id.
PS: SQLite является используемым SQL фонового

ответ

1
-- Table containing sequences for all items 
CREATE TABLE serials (
    item_id INTEGER PRIMARY KEY REFERENCES Items(id) ON DELETE CASCADE, 
    seq DEFAULT 1 
); 

-- Automatically add new serial entries for new items 
CREATE TRIGGER serial_for_new_item AFTER INSERT ON Items 
BEGIN 
    INSERT INTO serials VALUES (new.id); 
END; 

-- Automatically set serials 
CREATE TRIGGER update_seq AFTER INSERT ON Association 
BEGIN 
    UPDATE Association 
     SET item_serial = (
          SELECT seq 
           FROM serials 
           WHERE item_id = new.item_id 
         ) 
    WHERE id = new.id; 

    UPDATE serials SET seq = seq + 1 WHERE item_id = new.item_id; 
END; 

Вот как это работает:

  • Таблица serials имеет одну строку для каждого элемента, который вы имеете в Items таблицы. Он предоставляет вам порядковые номера для каждого элемента. У этого есть ограничение внешнего ключа, поэтому он едва ли подходит к таблице Items. Когда вы удаляете элемент из Items, его серийная запись от serials также будет удалена (не забудьте включить в ваш SQLite-соединение внешние ключи).
  • serial_for_new_item гарантирует, что при вставке нового изделия в таблицу Items будет создана начальная запись, сделанная в таблице serials.
  • Триггер update_seq автоматически устанавливает правильный серийный номер для каждой записи, которую вы вставляете в таблицу Association. Он также увеличивает текущий серийный номер для недавно вставленной ассоциации элементов.

В основном это сделает все автоматически для вас. Вам не нужно писать гораздо больше, просто создавайте эти объекты в базе данных.

Если у вас уже есть какие-либо записи в таблице Items, вам придется заполнить таблицу serials.