【问题标题】:MySQL auto increment for certain groups in a DB table数据库表中某些组的 MySQL 自动增量
【发布时间】:2021-06-13 15:45:24
【问题描述】:

我创建了以下 mySQL 表,但不确定如何正确自动递增 entry_id。理想情况下,自动增量适用于每个 order_id。例如,如果我有 3 个订单 ID 为 1 的条目,那么这些条目的 ID 为 1、2、3。同样,如果我有 3 个订单 id 2 的条目,那么这些也将具有条目 ID 1、2、3。这可以实现吗?

/* Table `ims`.`OrderEntries` */
CREATE  TABLE IF NOT EXISTS `ims`.`OrderEntries` (
    `ENTRY_ID` INT NOT NULL AUTO_INCREMENT,
    `ORDER_ID` INT NOT NULL ,
    `ITEM_ID` INT NOT NULL ,
    `ITEM_NAME_AT_TIME_OF_ORDER` INT NOT NULL ,
    `ITEM_COST_AT_TIME_OF_ORDER` DECIMAL NOT NULL ,
    `ITEM_QUANTITY` INT NOT NULL ,
    PRIMARY KEY (`ORDER_ID`, `ITEM_ID`)
);

【问题讨论】:

    标签: mysql auto-increment


    【解决方案1】:

    您甚至不需要费心去实现它,尤其是随着支持ROW_NUMBER 的 MySQL 8+ 的出现。要生成上面描述的系列,您可以简单地使用:

    SELECT ENTRY_ID, ORDER_ID, ROW_NUMBER() OVER (PARTITION BY ORDER_ID ORDER BY ENTRY_ID) SEQ
    FROM OrderEntries
    ORDER BY ORDER_ID, ENTRY_ID;
    

    这会生成如下所示的内容:

    ENTRY_ID | ORDER_ID | SEQ
    1        | 1        | 1
    2        | 1        | 2
    3        | 1        | 3
    4        | 2        | 1
    5        | 2        | 2
    6        | 2        | 3
    

    【讨论】:

    • 这不起作用,因为我需要运行 CRUD 方法,这些方法将使用 order_id 和 entry_id 引用条目,因此我需要在插入时生成这些数字。
    • 为什么你认为你需要两个序列?我怀疑你真的需要它们。请在这里解释你的逻辑。
    • entry_id 只需要一个序列,订单 ID 不需要序列,因为这是通过不同的表生成的)。我唯一的问题是,当添加条目时,它们的 ID 需要映射到订单 ID。例如。如果我的用户想要查看与特定 order_id 相关的订单条目,则数字不会是随机的,它们实际上会显示为条目 1、条目 2、条目 3 等。如果我只保留 ENTRY_ID 上的 AUTO_INCREMENT 那么这没有映射到 order_id。上面的解决方案适用于查看,但不适用于删除。例如。如果用户想要删除订单 id 1 的条目 2。
    • 那么自动递增序列往往会一直增加(有些例外,但通常是规则)。因此,您不需要1, 2, 3 来确定首先添加了哪些订单项目,您只需检查其中的任何数字序列即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 2011-12-05
    • 2015-07-05
    相关资源
    最近更新 更多