我想为一个有几个项目的项目服务器做一个小票证系统。到目前为止,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依赖于ProjectID的SQL?或者,在SQL中没有办法,我必须用PHP代码手动设置I?
发布于 2009-06-06 09:21:56
为什么不在项目表中有一个"next ticket id“字段-当创建一个新的ticket时,获取这个值,递增它,并将ticket id设置为以前的值?显然,这一切都是在一个交易中完成的。
发布于 2009-06-06 11:18:33
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-06 11:12:24
老实说,我通常试图说服请求者反对这一点。有一个唯一的票号可能更好,你只需要记住/打印/显示一条信息。只要你提供门票的清单和计数,我认为这是一个更清晰的结构。当然,您的业务逻辑可能需要单独编号。如果需要一条没有中断的直线,我通常使用触发器。M.
https://stackoverflow.com/questions/959342
复制相似问题