Intereting Posts

Сделать один ID с auto_increment в зависимости от другого ID – возможно?

Я хочу создать небольшую систему билетов для проектного сервера с несколькими проектами. Пока 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-кода вручную?

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

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

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

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