У меня есть поле ID, которое я бы хотел иметь в следующем формате:
YYMMDDXXXXXXXX, где YY — год, MM — месяц, DD — день, а XXXXXXXX — фактический номер идентификатора с ведущими нулями. Кроме того, номер идентификатора должен сбрасываться в 0 при изменении дня.
Во-первых, это не очень хорошая практика / формат для поля идентификатора, которое также будет первичным ключом?
Реализация:
Я вставляю данные в свою базу данных скинул php, я придумал 2 способа достижения указанного формата.
date('Ymd')
вызывает сбой apache дляALTER TABLE foo
AUTO_INCREMENT=(SELECT CURDATE()*100000000)
но, как я ожидал, CURDATE () не можетЛюбые идеи и / или помощь в моих попытках будет здорово, спасибо за ваше время.
Вместо этого представьте следующую схему:
CREATE TABLE foo (
id INTEGER AUTO_INCREMENT,
date DATETIME DEFAULT=NOW(),
PRIMARY KEY (id),
INDEX (date)
);
При необходимости сгенерируйте идентичный идентификатор с запросом:
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'));
Это сломается:
Сделай сам, и кто бы ни наследовал этот проект от тебя, сделай одолжение и держи отдельно DATETIME
столбец в этой таблице, так что значимая, не нарушенная информация все еще может быть извлечена из нее в будущем.
Других решений пока нет …