Уникальный идентификатор смешанного формата с префиксом даты (Php / MySQL) - PullRequest
0 голосов
/ 07 ноября 2011

Я создаю систему заявок, которая будет отслеживать билеты, которые создает клиент.Основная информация о билете будет храниться в таблице «билеты», структура которой выглядит следующим образом:

  Primary Key (int 255)
  Ticket_Key (varchar)
  Ticket Number (varchar 500)
  Label
  Date Created
  Delete

and so on..

Проблема в том, что в конечном итоге будет большое количество билетов, и нам нужен более унифицированный способ идентификацииБилеты.Я хотел бы, чтобы PHP создал номер билета в номере билета, который будет содержать смешанные значения.Дата (в формате 20111107), за которой следует автоматически увеличенное значение 1001. 1002, 1003, ...).Таким образом, номер билета будет 201111071001 для примера.

Проблема в том, как мне запрограммировать это на PHP для вставки в базу данных MySQL?Кроме того, как я могу предотвратить возможность дублирования значений в уникальном идентификаторе в PHP?Будет очень много клиентов, использующих таблицу для вставки записей.

Ответы [ 3 ]

1 голос
/ 07 ноября 2011

Как насчет использования автоинкремента и объединения его с полем даты для генерации порядкового номера на эту дату и, следовательно, ticketId.

Итак, ваш процесс вставки будет выглядеть примерно так:

INSERT INTO table (...ticket info...)

Затем вы получите автоприращение для этой строки и выполните запрос, подобный этому

UPDATE table SET sequence = (SELECT ($id-MAX(auto_increment)) FROM table WHERE date_created=DATE_SUB(CURDATE(),INTERVAL 1 DAY)) WHERE auto_increment=$id

Вы можете легко создать тикет в формате YYYMMDDXXXX. Предполагая, что вы никогда не добавляли ретро-билеты в прошлом, это потребует только этих двух запросов даже при интенсивном использовании.

[РЕДАКТИРОВАТЬ] На самом деле, после изучения этого есть гораздо лучший способ сделать это изначально в MySQL. Если вы определите два столбца (дата и последовательность) и сделаете их первичным ключом (оба столбца) с полем последовательности в качестве автоинкремента, то MySQL обновит столбец последовательности как автоинкремент на дату (т.е. он будет начинаться со значения 1 за каждую дату).

[РЕДАКТИРОВАТЬ] Структура таблицы по этим направлениям сделает работу за вас:

CREATE TABLE IF NOT EXISTS `table` (
  `created_date` date NOT NULL,
  `ticket_sequence` int(11) NOT NULL auto_increment,
  `label` varchar(100) NOT NULL,
  [other fields as required]
   PRIMARY KEY  (`created_date`,`ticket_sequence`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

При получении данных вы можете сделать что-то вроде

SELECT CONCAT( DATE_FORMAT(created_date,'%Y%m%d'),LPAD(ticket_sequence,4,'0')) AS ticket_number, other fields.... FROM table
0 голосов
/ 07 ноября 2011

Я делал что-то подобное раньше, где я хотел обновлять счетчик для каждого нового дня. К сожалению, я не говорю на PHP, поэтому вам придется довольствоваться объяснениями и, возможно, псевдокодом.

Во-первых, создайте пару полей в файле конфигурации, чтобы отслеживать ваш счетчик. Это должно быть поле даты и число полей ...

LastCount (Number)
LastCountDate (Date)

Затем убедитесь, что в поле номера билета в таблице базы данных заданы только уникальные значения, поэтому при попытке вставить дубликат выдается ошибка.

Затем в вашем коде вы загружаете значения счетчиков (LastCount и LastCountDate) и обрабатываете их следующим образом ...

newCount = LastCount;

if LastCountDate == Today 
   increment newCount (newCount++)
else
   reset newCount (newCount = 1)

Затем вы можете использовать newCount для создания номера вашего билета.

Далее, когда вы пытаетесь вставить строку, если она успешна, тогда отлично. Если это не удастся, вам нужно снова увеличить newCount, а затем попробуйте вставить снова. Повторяйте это, пока вставка не будет успешной (поместите ее в цикл)

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

Надеюсь, это чем-то поможет.

0 голосов
/ 07 ноября 2011

насколько я понимаю, вы хотите получить один результат из двух разных полей, таких как datefield и ticketnumfield

в MySQL вы делаете это с помощью команды:

SELECT concat( datefield, ticketnumfeild ) FROM `tbl_name`

этот запрос возвращает результат как 201111071001

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...