【问题标题】:Make one ID with auto_increment depending on another ID - possible?根据另一个 IS 使一个 ID 自动递增 - 可能吗?
【发布时间】:2010-10-31 20:30:52
【问题描述】:

我想为具有多个项目的项目服务器制作一个小型票务系统。 到目前为止,TicketID 将被全局计算,即有一个项目 A 和一个 TicketID 为 1 的工单和另一个项目 B 并且该项目的工单将获得 TicketID 2 - 像这样:

(TicketID, ProjectID)
(1, 1)
(2, 1)
(3, 1)
(4, 2)
(5, 2)
(6, 3)

但我认为根据 ProjectID 计算 TicketID 会更好,例如:

(TicketID, ProjectID)
(1, 1)
(2, 1)
(3, 1)
(1, 2)
(2, 2)
(1, 3)

这里是表格:

CREATE  TABLE IF NOT EXISTS tickets (
    TicketID    INT UNSIGNED NOT NULL AUTO_INCREMENT,
    ProjectID   INT UNSIGNED NOT NULL,
    ...
    PRIMARY KEY (TicketID, ProjectID) ,
    FOREIGN KEY (ProjectID) REFERENCES projects (ProjectId),    
    ...
);

是否可以根据 ProjectID 使用 SQL 来制作带有 auto_increment 的 TicketID? 或者 SQL 没有办法,我必须用我的 PHP 代码手动设置 ID?

【问题讨论】:

    标签: sql primary-key auto-increment


    【解决方案1】:

    MySQL 支持这个:

    create table history (
        id integer not null,
        version integer auto_increment not null,
        content text not null,
        primary key(id,version)
    );
    

    据我所知,Sqlite 或 PostgreSQL 中不直接支持此类功能,所以我只使用:

    insert into history(id,version,content)
    select 10,(SELECT COALESCE(MAX(version),0)+1 FROM history WHERE id=10),'Hello';
    

    对于他们,但请记住,这不是真正的自动增量,并且可能会创建不唯一的键,如果 你从桌子上移走一些东西。

    【讨论】:

    • #1075 - 表定义不正确;只能有一个自动列,并且必须定义为一个键
    【解决方案2】:

    老实说,我通常会试图说服请求者反对这一点。拥有唯一的票证编号可能会更好,您只需要记住/打印/显示一条信息。只要您提供门票的清单和数量,我认为这是一个更清晰的结构。 当然,您的业务逻辑可能需要单独编号。如果需要一条没有中断的直线,我通常使用触发器。 M.

    【讨论】:

      【解决方案3】:

      为什么在项目表上没有“下一个工单 id”字段 - 当创建一个新工单时,获取这个值,增加它并将工单 ID 设置为以前的值?显然,一切都在交易中。

      【讨论】:

      • +1 这是干净的方法。回答最初的问题:不,没有办法制作一个依赖的自动递增字段。 :-) 至少对于 MySql 或 SQL Server 来说不是,而且我发现很难想象这是在其他任何地方实现的。
      猜你喜欢
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 2015-12-24
      • 1970-01-01
      • 2011-06-07
      • 2011-01-10
      • 1970-01-01
      相关资源
      最近更新 更多