2009-06-06 8 views
0

私はいくつかのプロジェクトを持つプロジェクトサーバのために小さなチケットシステムを作りたいと思っています。別のIDに応じてauto_incrementで1つのIDを作成することは可能ですか?

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

をしかし、私は思う:次のように - は、これまでのところTicketIDは、プロジェクトAとTicketID 1とチケットと別のプロジェクトBとTicketID 2取得します。このプロジェクトのためのチケットがあるすなわち、世界的にカウントされますここで

(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),  
    ... 
); 

それを作ることが可能です。TicketIDのようなPROJECTIDに応じてカウントする方が良いだろうSQLとProjectIDに応じてauto_incrementのTicketID? また、SQLを使用する方法がないので、手動でPHPコードでIDを設定する必要がありますか?

答えて

2

プロジェクトテーブルに「次のチケットID」フィールドがないのはなぜですか?新しいチケットを作成するときにこの値を取得し、それを増分してチケットIDを前の値に設定しますか?すべての取引で、明らかに。

+0

+1これはきれいなアプローチです。元の質問に答えるには:いいえ、従属する自動増分フィールドを作成する方法はありません。少なくともMySqlやSQL Serverではそうではありませんが、どこにでも実装されているとは想像もつきません。 – Tomalak

0

正直言って、私は通常これに対してリクエスタを説得しようとします。一意のチケット番号を付けるほうがいいかもしれませんが、1つの情報を覚えたり、印刷したり表示したりするだけです。あなたがチケットのリストと数を提供する限り、私はそれがはるかに明確な構造であると思う。 もちろん、ビジネスロジックには別々の番号が必要な場合があります。中断のない直線が必要な場合は、通常はトリガーを使用します。 M.

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'; 

を、実際の自動インクリメントではないことを覚えておいて、 テーブルから何かを削除すると、一意のキーが作成されない可能性があります。

関連する問題