Сделать один идентификатор с auto_increment в зависимости от другого идентификатора - возможно? - PullRequest
0 голосов
/ 06 июня 2009

Я хочу сделать небольшую тикет-систему для сервера проектов, который имеет несколько проектов. До сих пор TicketID будет учитываться глобально, то есть есть проект A и билет с TicketID 1 и другим проектом B, и билет для этого проекта получит TicketID 2 - как это:

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

Но я думаю, что было бы лучше рассчитать TicketID в зависимости от ProjectID, например:

(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 с auto_increment в зависимости от ProjectID с SQL? Или нет никакого способа с SQL, и я должен установить идентификаторы с моим PHP-кодом вручную?

Ответы [ 3 ]

2 голосов
/ 06 июня 2009

Почему бы не иметь поле "идентификатор следующего билета" в таблице проекта - при создании нового билета получить это значение, увеличить его и установить идентификатор билета в предыдущее значение? Все в сделке, очевидно.

1 голос
/ 06 июня 2009

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

Для них, но помните, что это не настоящий автоинкремент и может создавать не уникальные ключи, если вы что-то убираете со стола.

0 голосов
/ 06 июня 2009

Честно говоря, я обычно пытаюсь убедить заказчиков в этом. Наличие уникальной нумерации билетов может быть лучше, вам нужно только запомнить / распечатать / показать одну часть информации. Пока вы предоставляете списки и количество билетов, я думаю, что это гораздо более четкая структура. Конечно, ваша бизнес-логика может потребовать отдельной нумерации. Если требуется прямая линия без прерывания, я обычно использую триггеры. M.

...