Java SQLite, что мне следует использовать вместо ORDER BY в запросе UPDATE, чтобы избежать ограничения дублирования ключJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Java SQLite, что мне следует использовать вместо ORDER BY в запросе UPDATE, чтобы избежать ограничения дублирования ключ

Сообщение Anonymous »

В настоящее время я обновляю приложение, которое поддерживает только MariaDB в качестве базы данных, чтобы также поддерживать другие типы баз данных, такие как SQLite. Это включает в себя просмотр каждого метода MariaDB и перевод запросов для работы с SQLite. На самом деле я не могу слишком сильно изменить структуру таблиц в базе данных, поскольку остальная часть кода уже во многом зависит от конкретного макета.
База данных содержит информацию о различных графических интерфейсах. Конкретные таблицы, с которыми у меня возникают проблемы, поддерживают нумерацию страниц. Каждый элемент в этих таблицах хранит GuiID, номер страницы и местоположение на странице, которые вместе действуют как составной ключ.
< table class="s-table">


gui_id
страница
позиция
содержание




1
0
2
Привет!


1
1
0
Текст


1
2
1
Еще текст


1
3
1
Ещё Больше текста



Выше приведен упрощенный пример того, как это может выглядеть для одного конкретного графического интерфейса. На странице также может быть несколько элементов.
Проблема возникает при попытке реализовать методы InsertPage() и deletePage(). Вот как выглядит реализация MariaDB для метода вставки страницы:

Код: Выделить всё

UPDATE contents SET page = page + 1 WHERE gui_id=? AND page >= ? ORDER BY page DESC
Обратное также верно для метода удаления страницы.
Здесь запрос должен использовать предложение ORDER BY, чтобы гарантировать, что номер страницы обновляется с от самого высокого к самому низкому, а не от самого низкого к высшему, чтобы гарантировать, что никогда не будет повторяющейся ошибки ключа. Если бы номера страниц увеличивались наоборот, используя приведенную выше таблицу в качестве примера, третья строка вниз будет конфликтовать с четвертой строкой вниз при обновлении. Тот же принцип применим и к методу удаления страницы.
К сожалению, SQLite не поддерживает ORDER BY для использования с UPDATE. Я бы предпочел не удалять здесь ограничения составного ключа, так как мне хотелось бы сохранить как можно больший паритет с реализацией MariaDB.
Я могу придумать два возможных решения: :
A. Выберите каждую строку, отсортируйте ее в коде, а затем обновите каждую строку вручную в цикле while. Определенно плохая идея и будет крайне неэффективной для больших графических интерфейсов.
B – Создайте временную таблицу, чтобы внести изменения, и объедините ее обратно с исходной. Это кажется немного слишком сложным, и я чувствую, что, вероятно, есть более простое решение.
Если у кого-нибудь есть какие-либо советы, я буду очень признателен.
Изменить : Я обновлю ниже, чтобы объяснить ограничение дублирования ключей более подробно с помощью более «абстрактной» таблицы.
Скажем, у меня есть следующие данные:
< div class="s-table-container">


page
слот
содержимое




0
1
текст1

< tr>
0
2
text2


1
1
текст3


1
2
text4



В приведенном выше примере столбцы «страница» и «слот» при объединении образуют уникальное ключевое ограничение. Эти столбцы не могут повторяться.
Теперь я хочу вставить новую страницу в начало. Конечная цель при этом будет выглядеть так:



страница
слот
содержимое



0
1
< td>text5


1
1
text1


1
2
text2


2
1
текст3


2
2text4



Как видите , столбец «страница» увеличился на единицу для всех строк, после чего была вставлена ​​новая страница (для ясности я упорядочил ее по номеру страницы).
Оператор SQL для этого может выглядеть следующим образом: UPDATE Pages SET page = page + 1, предшествующий оператору вставки для новой строки.
Однако при его выполнении выдается повторяющаяся ошибка ключа. Это связано с тем, что SQL перемещается по таблице сверху вниз и достигает ограничения повторяющегося ключа при обновлении первой строки вниз. Номер страницы увеличивается, что приводит к конфликту с третьей строкой вниз.
С помощью MariaDB я могу решить эту проблему, используя ORDER BY в операторе обновления, где я могу заставить его сначала увеличить номер страницы для самого высокого номера страницы, что означает, что не возникает ошибок дублирования ключей.
Это именно та функциональность, которую я ищу в SQLite.
Обновление: В качестве окончательного обновления я решил просто удалить ограничения уникальных ключей с помощью реализации SQLite. Теоретически можно использовать временные таблицы для достижения той же функциональности, но, чтобы сохранить удобство сопровождения, я решил не использовать более сложный подход.
Я' Буду следить за ответами на этот вопрос в будущем, так как я до сих пор не нашел правильного решения проблемы.

Подробнее здесь: https://stackoverflow.com/questions/784 ... ery-to-avo
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»