Строка таргетинга в базе данных - PullRequest
0 голосов
/ 15 февраля 2019

У меня проблемы с таргетингом на конкретную строку в моей базе данных

Я хочу иметь возможность выбирать из контактов таблицы ГДЕ rownumber = 5 (например)

  select * from Contacts WHERE RowNum = 5

Это не 'Это не работает, однако он должен выбрать данные, где число равно 5.

РЕДАКТИРОВАТЬ: теперь это исправлено, правильный код был:

("select rowid, * from Contacts WHERE rowid = $num+1")

1 Ответ

0 голосов
/ 17 февраля 2019

Хотя вы нашли решение, которое работает;использование rowid может быть сопряжено с текущими проблемами.

  • Существует зависимость от списка, представленного в соответствии с порядком rowid что не обязательно будет приемлемо для пользователя.

  • Не гарантируется монотонное увеличение столбца rowid (хотя весьма вероятно, если вы не достигнете 9223372036854775807-й строки).

  • rowid не будет отражать n-ую строку, если строки будут удалены, rowid останется прежним, но VACUUM (очистка) будетперенумеровать rowid .

  • Если наибольшее из существующих rowid равно 9223372036854775807, то будет сделана попытка присвоить случайное значение, котороене используется, если назначен новый rowid (вставлена ​​новая строка).

Вышеприведенное верно, если псевдоним rowid отсутствует.Если в отношении VACUUM существует такое поведение, то значения rowid будут сохранены и, следовательно, не перенумерованы.

  • определение столбца с помощью column_name INTEGER PRIMARY KEY - это какдля столбца создается псевдоним rowid

    • Если используется ключевое слово AUTOINCREMENT ( оно может использоваться только для столбца, которыйпсевдоним rowid столбец ).Тогда поведение снова отличается тем, что новый rowid должен быть выше, чем самый высокий rowid , который когда-либо использовался (а не самый высокий из существующих).Если был использован rowid 9223372036854775807, то новая строка не может быть вставлена, и будет выдана ошибка SQLITE_FULL.

Обычно требуется n-ая позиция, когдасписок представлен, например,

Alan
Mary
Bert
Sue
Fred
Jane
Zac
Louise

Тогда Фред является 5-м в списке или элементом со смещением 4 массива и, следовательно, rowid 5 будет Фред ЕСЛИ данныебыл вставлен в указанном выше порядке .

Однако, если список был упорядочен по имени, он был бы представлен как: -

Alan
Bert
Fred
Jane
Louise
Mary
Sue
Zac

Если рассматривать из rowid перспектива списка будет

1 (Alan)
3 (Bert)
5 (Fred)
6 (Jane)
8 (Louise)
2 (Mary)
4 (Sue)
7 (Zac)

Так что теперь Фред занимает 3-е место, но с помощью WHERE rowid = 3 выберет Берт, а не Фред.

Удаление любой строки, кроме последней (без упорядочивания)вводит несоответствие между уравнением rowid = number in list.

Предполагаемое использование rowid состоит в том, чтобы идентифицировать конкретную строку, а не быть ожидаемым значением.Во всех вышеупомянутых сценариях осложнения могут быть устранены путем представления списка, но иметь параллельный массив rowid , поэтому при выборе Fred в качестве смещения 4 затем смещение 4 в параллельном массиве дает значение 5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...