Есть таблица вида:
id int auto increment
tuple_first char(32)
tuple_second char(32)
other_field text
...
В которой соответственно id - это суррогатный ключ, а пара ( tuple_first, tuple_second ) - должна быть уникальной в пределах таблицы (на ней стоит уникальный ключ).
Данные в таблицу вставляются (и иногда обновляются) как
insert ... on duplicate key update
Проблема в следующем:
- если оставить всё, как есть, то primary key
будет обновляться при каждой вставке, из-за чего он когда-то закончится.
- убрать суррогатный ключ, и использовать как первичный кортеж нельзя - во-первых,
длинный первичный ключ это плохо, во-вторых, ряд ОРМ (например, Eloquent) не умеет работать с первичными ключами на несколько колонок.
- убрать
insert ... on duplicate key update
и при вставке вручную проверять и делать insert/update в зависимости от наличия строки в таблице - это кажется тупостью.
Собственно, вопрос: как умные люди решают вопрос уникального кортежа в такой таблице?
У меня пока есть только одно компромиссное решение: использовать как primary key ещё одну колонку, в которой будет md5( tuple_first, tuple_second ). Но очевидно, что это решение содержит в себе все минусы от всех предыдущих, пускай и в меньшей мере.