根据另一个ID创建一个带有auto_increment的ID - 可能吗?

时间:2009-06-06 09:17:12

标签: sql primary-key auto-increment

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

是否可以使用auto_increment生成TicketID,具体取决于带有SQL的ProjectID? 或者没有办法使用SQL,我必须手动设置我的PHP代码ID?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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';

对于他们来说,但请记住,这不是真正的自动增量,如果是,可能会创建不唯一的密钥 你从表中删除了一些东西。

答案 2 :(得分:0)

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