У меня есть следующая таблица, у которой нет первичного ключа.
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 однозначно идентифицирует каждую запись без дубликатов.
Я использую sqlite-net-pcl 1.9.172 и SQLitePCLRaw.bundle_green 2.1.8.
Используя совет от DBeaver, который предоставляет пользователям диалоговое окно для таблиц без PK, он позволяет вам использовать значения всех столбцов таблицы в качестве идентификатора вместо PK.
Имеет ли смысл добавлять ПК (в любой форме — новое свойство или использование (комбинации) существующих)?
У меня есть следующая таблица, у которой нет первичного ключа.
Первичный ключ — это тип ограничения, который используется для применения ограничения к одному или нескольким столбцам таблицы для обеспечения целостности данных. Первичный ключ помогает нам гарантировать отсутствие повторяющихся записей с тем же токеном или идентификатором. В таблице, когда мы определяем ограничение первичного ключа для определенного столбца, наша таблица сохраняет все записи физически в порядке первичного ключа, благодаря чему поиск данных происходит очень быстро.
Поэтому лучше всего определять первичный ключ для наших таблиц. Обновлено: первичный ключ используется в качестве индекса, и без индексов дБ должен выполнять полное сканирование таблицы, а не сканировать индекс.
А поскольку вы используете 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 записей, и я думал о том, чтобы в них не было идентификаторов. Спасибо, что помогли мне поступить правильно!
Что это за библиотека драйверов? Я не знаком с этим API.