Я хочу представить список "привет", "привет", "до свидания", "хорошего дня", "привет" (с таким порядком) в таблице SQL:
pk | i | val
------------
1 | 0 | hi
0 | 2 | hello
2 | 3 | goodbye
3 | 4 | good day
5 | 6 | howdy
'pk' - столбец первичного ключа. Не обращайте внимания на его значения.
«i» - это «индекс», который определяет порядок значений в столбце «val». только используется для установления порядка, а значения в противном случае не важны.
У меня проблема с вставкой значений в список при сохранении порядка. Например, если я хочу вставить «эй», и я хочу, чтобы оно отображалось между «привет» и «до свидания», то мне нужно сместить значения «i» для «до свидания» и «хорошего дня "(но желательно не" привет "), чтобы освободить место для новой записи.
Итак, есть ли стандартный шаблон SQL для выполнения операции сдвига, но только сдвиг элементов, которые необходимы? (Обратите внимание, что простая «таблица UPDATE SET i = i + 1 WHERE i> = 3» не работает, поскольку она нарушает ограничение уникальности для «i», а также без необходимости обновляет строку «howdy».)
Или, есть ли лучший способ представить упорядоченный список? Я полагаю, что вы могли бы сделать 'i' значением с плавающей запятой и выбрать значения между ними, но тогда вам придется выполнить отдельную операцию перебалансировки, когда такого значения не существует.
Или есть какой-нибудь стандартный алгоритм для генерации строковых значений между произвольными другими строками, если бы я сделал 'i' varchar?
Или я должен просто представить его как связанный список? Я избегал этого, потому что хотел бы также иметь возможность сделать SELECT .. ORDER BY, чтобы привести все элементы в порядок.