在另一列的上下文中对列进行自动递增

时间:2014-10-07 18:34:44

标签: sqlite database-design

我正在开发一个销售点系统,其中:

  1. 用户可以添加将要销售的商品。
  2. 每个销售操作生成一个记忆已售商品的配方
  3. 该应用程序为每个销售产品生成一个序列号,每次销售该产品时,该序列号增加一个 例如:我卖过产品A& B,所以他们每个人都得到序列1.然后我再次销售产品A,所以它必须得到序列2,而B的序列号仍然是1。
  4. 我不清楚如何实现这一点,但这是我做的架构设计:

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

    我想知道是否可以根据item_id使item_serial自动增加。
    PS:SQLite是使用过的SQL后端

1 个答案:

答案 0 :(得分: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表格。