В комментарии вы задаете вопрос об эффективности.Если вы не имеете дело с экстремальными томами, хранение 8-байтового DATETIME не является чрезмерной нагрузкой по сравнению с использованием, например, 4-байтового INT.
Это также значительно упрощает вставку данных, а такжеспособен справляться с удаляемыми записями, не создавая «дыр» в вашей последовательности.
Если вам это НУЖНО, будьте осторожны с именами полей.Если у вас в таблице uid
и id
, я ожидаю, что id
будет уникальным в этой таблице, а uid
будет ссылаться на что-то еще.Возможно, вместо этого используйте имена полей property_id
и amendment_id
.
С точки зрения реализации, как правило, есть два варианта.
1),Триггер
Реализации различаются, но логика остается той же.Поскольку вы не указываете СУБД (кроме НЕ MS / Oracle), общая логика проста ...
- Начать транзакцию (часто это неявно уже запущено внутри триггеров)
- Найдите
MAX(amendment_id)
для вставляемого property_id - Обновите добавленное значение с помощью
MAX(amendment_id) + 1
- Подтвердите транзакцию
Что нужно знатьare ...
- одновременная вставка нескольких записей
- вставка записей с уже заполненным идентификатором поправки
- обновления, изменяющие существующие записи
2).Хранимая процедура
Если вы используете хранимую процедуру для управления записью в таблицу, вы получаете гораздо больший контроль.
- Неявным образом вы знаете, что имеете дело только с одной записью,
- Вы просто не предоставляете параметр для полей DEFAULT.
- Вы знаете, что обновления / удаления могут и не могут произойти.
- Вы можете реализовать всю бизнес-логику без скрытых триггеров
Я лично рекомендую маршрут хранимой процедуры, но триггеры работают.