Добавить префикс даты на MySQL ID

У меня есть поле ID, которое я бы хотел иметь в следующем формате:
YYMMDDXXXXXXXX, где YY — год, MM — месяц, DD — день, а XXXXXXXX — фактический номер идентификатора с ведущими нулями. Кроме того, номер идентификатора должен сбрасываться в 0 при изменении дня.

Во-первых, это не очень хорошая практика / формат для поля идентификатора, которое также будет первичным ключом?

Реализация:

Я вставляю данные в свою базу данных скинул php, я придумал 2 способа достижения указанного формата.

  • Вставка вручную с помощью запроса вставки php (нет AUTO_INCREMENT на
    поле), я выбираю МАКС (идентификатор), делю его (дата-идентификатор), проверяю день
    изменилось, а затем либо просто увеличить его на единицу, либо заменить на
    newdate + 0s. Проблема с этим способом заключается в том, что я должен сделать дополнительную
    SELECT и проверьте / измените строку, SELECT может вернуть тот же MAX (id), если у меня больше 20
    запросов / сек, а также date('Ymd') вызывает сбой apache для
    более 60 запросов / сек
  • Добавление AUTO_INCREMENT в поле ID и установите AUTO_INCREMENT на
    ГГММДД00000000, когда день меняется, то пусть auto_increment
    сделать работу. Я старался ALTER TABLE foo
    AUTO_INCREMENT=(SELECT CURDATE()*100000000)
    но, как я ожидал, CURDATE () не может
    использовать как это.

Любые идеи и / или помощь в моих попытках будет здорово, спасибо за ваше время.

0

Решение

Разумный путь:

  1. Скажите руководителю вашей команды, что этот дизайн имеет серьезные недостатки.
  2. Вместо этого представьте следующую схему:

    CREATE TABLE foo (
    id INTEGER AUTO_INCREMENT,
    date DATETIME DEFAULT=NOW(),
    PRIMARY KEY (id),
    INDEX (date)
    );
    
  3. При необходимости сгенерируйте идентичный идентификатор с запросом:

    SELECT CAST(DATE_FORMAT(date,'%Y%m%d') AS UNSIGNED)*100000000 + id AS 'weird_id'
    

    Хотя это не сработает, если ваши идентификаторы станут> 10 000 000, хотя мое тестирование показывает, что использование BIGINT для этой схемы должно быть в состоянии обработать еще один или два нуля. Вы также можете обойти ограничения целочисленного типа, выбрав этот идентификатор в виде строки, например:

    SELECT CONCAT(DATE_FORMAT(date, '%Y%m%d'), LPAD(id,10,'0')) AS 'weird_id'
    

    куда 10 в LPAD() может быть столько цифр, сколько вы хотите.

Не вменяемый, спасающий лицо, будущий кошмарный способ:

У тебя почти было это. CURDATE() возвращает строку и ALTER TABLE foo AUTO_INCREMENT= ожидает целое число и ничего, кроме целого числа. Нет функций, переменных и т. Д. Следующее будет работать:

Баш:

mysql -u root -e "ALTER TABLE dbname.foo AUTO_INCREMENT = $(date +%Y%m%d0000000000);"

PHP:

$query = sprintf("ALTER TABLE dbname.foo AUTO_INCREMENT = %s;", str_pad(date("Ymd", time()), 18, '0'));

Это сломается:

  • Всякий раз, когда Кронд икота
  • Вероятно, при переходе на летнее время
  • Случайно и без видимой причины
  • После полуночи 31 декабря 9999 г.

Сделай сам, и кто бы ни наследовал этот проект от тебя, сделай одолжение и держи отдельно DATETIME столбец в этой таблице, так что значимая, не нарушенная информация все еще может быть извлечена из нее в будущем.

1

Другие решения

Других решений пока нет …