Как мне обновить запись SQLight в таблице без первичного ключа?

У меня есть следующая таблица, у которой нет первичного ключа.

public class Person
{
  public string PersonId { get; set; }
  public string ConfirmationNumber { get; set; }
  public string Sid  { get; set; }
}

Я вставляю запись с этими значениями

Person p = new Person();
p.PersonId = 0;
p.ConfirmationNumber = "ABC-DEF-GHJ";
p.Sid = "19240";

await DatabaseAsync.InsertAsync(p);

Затем мне нужно обновить эту запись этими значениями.

p.PersonId = 2047;
p.ConfirmationNumber = "ABC-DEF-GHJ";
p.Sid = "19240";

SQLight не имеет Update.With()

Я думал удалить запись и вставить ее заново с новыми значениями, но SQLight не имеет метода Delete.With(). и я не могу использовать replace(), поскольку у этой таблицы нет первичного ключа.

Примечание: Комбинация ConfirmationNumber и Sid однозначно идентифицирует каждую запись без дубликатов.

Что это за библиотека драйверов? Я не знаком с этим API.

Fildor 13.08.2024 08:02

Я использую sqlite-net-pcl 1.9.172 и SQLitePCLRaw.bundle_green 2.1.8.

Austin 13.08.2024 08:53

Используя совет от DBeaver, который предоставляет пользователям диалоговое окно для таблиц без PK, он позволяет вам использовать значения всех столбцов таблицы в качестве идентификатора вместо PK.

Jeremy Thompson 13.08.2024 10:46

Имеет ли смысл добавлять ПК (в любой форме — новое свойство или использование (комбинации) существующих)?

Fildor 13.08.2024 11:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У меня есть следующая таблица, у которой нет первичного ключа.

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

Поэтому лучше всего определять первичный ключ для наших таблиц. Обновлено: первичный ключ используется в качестве индекса, и без индексов дБ должен выполнять полное сканирование таблицы, а не сканировать индекс.

А поскольку вы используете nuget sqlite-net-pcl, вы можете добавить первичный ключ для таблицы Person следующим образом:

public class Person
{
  // add primary key `ID`
  [PrimaryKey, AutoIncrement]
  public int ID { get; set; }

  public string PersonId { get; set; }
  public string ConfirmationNumber { get; set; }
  public string Sid  { get; set; }
}

Примечание:

Для получения дополнительной информации об этом вы можете проверить официальный документ Локальные базы данных .NET MAUI.

И есть официальный пример, вы можете проверить его здесь: .NET MAUI — локальная база данных с SQLite.

Я обновил все таблицы с помощью идентификатора и теперь использую DatabaseAsync.UpdateAsync(p); чтобы сделать обновление. Это нормально, но это вынуждает меня выполнить второй запрос, чтобы получить идентификатор новой записи, чего я пытался избежать. Я хотел просто 1) вставить новую запись, 2) получить идентификатор человека (с сервера), 3) обновить только что вставленную запись. с этим PersonId. Использование этого предложенного метода требует дополнительного запроса для получения идентификатора новой вставленной записи. В этих таблицах менее 100 записей, и я думал о том, чтобы в них не было идентификаторов. Спасибо, что помогли мне поступить правильно!

Austin 13.08.2024 19:05

Другие вопросы по теме