2009-06-06 9 views
0

Ich möchte ein kleines Ticket-System für einen Projektserver erstellen, der mehrere Projekte hat. Bisher ist die TicketID wird weltweit gezählt werden, dh es gibt ein Projekt A und ein Ticket mit TicketID 1 und ein weiteres Projekt B und das Ticket für dieses Projekt erhalten TicketID 2 - wie folgt aus:Eine ID mit auto_increment abhängig von einer anderen ID erstellen - möglich?

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

Aber ich denke, es wäre besser, die TicketID auf dem ProjectID abhängig zu zählen, wie:

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

Hier ist die Tabelle:

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

Ist es möglich, das zu machen, TicketID mit auto_increment abhängig von der ProjectID mit SQL? Oder gibt es keine Möglichkeit mit SQL und ich muss die IDs mit meinem PHP-Code manuell setzen?

Antwort

2

Warum haben Sie kein "next ticket id" -Feld in der Projekttabelle - wenn Sie ein neues Ticket erstellen, erhalten Sie diesen Wert, inkrementieren Sie ihn und setzen Sie die Ticket-ID auf den vorherigen Wert? Alles in einer Transaktion, offensichtlich.

+0

+1 Das ist der saubere Ansatz. Um die ursprüngliche Frage zu beantworten: Nein, es gibt keine Möglichkeit, ein abhängiges automatisch erhöhendes Feld zu erstellen. :-) Zumindest nicht für MySql oder SQL Server, und ich kann mir schwer vorstellen, dass dies irgendwo anders implementiert ist. – Tomalak

0

Ehrlich gesagt, versuche ich normalerweise, Anfrager davon zu überzeugen. Wenn Sie eine eindeutige Ticketnummerierung haben, ist es möglicherweise besser, Sie müssen sich nur eine Information merken/drucken/anzeigen. Solange Sie Listen und Zählungen der Tickets bereitstellen, denke ich, dass es eine viel klarere Struktur ist. Ihre Geschäftslogik erfordert natürlich eine separate Nummerierung. Wenn eine gerade Linie ohne Unterbrechung erforderlich ist, verwende ich normalerweise Trigger. diese M.

1

MySQL unterstützt:

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

Soweit ich weiß, gibt es keine direkte Unterstützung dieser Funktion in SQLite oder PostgreSQL so verwende ich nur:

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

Für sie Aber denken Sie daran, dass dies kein echtes Autoinkrement ist, und erstellen Sie möglicherweise keine eindeutigen Schlüssel, wenn Sie etwas aus der Tabelle entfernen.

Verwandte Themen