0

我想为具有多个项目的项目服务器制作一个小型票务系统。到目前为止,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),    
    ...
);

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

4

3 回答 3

2

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

于 2009-06-06T09:21:55.763 回答
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';

对他们来说,但请记住,这不是真正的自动增量,如果您从表中删除某些内容,可能会创建不唯一的键。

于 2009-06-06T11:18:33.050 回答
0

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

于 2009-06-06T11:12:23.903 回答