PrimaryKey и АвтоИнкремент - PullRequest
       1

PrimaryKey и АвтоИнкремент

0 голосов
/ 25 сентября 2018

В следующем коде, что означают PrimaryKey и AutoIncrement?

using SQLite;

namespace Todo
{
    public class TodoItem
    {
        [PrimaryKey, AutoIncrement]
        public int ID { get; set; }
        public string Name { get; set; }
        public string Notes { get; set; }
        public bool Done { get; set; }
    }
}

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

AUTOINCREMENT - это дополнительное ключевое слово, которое можно использовать только в одной ситуации, и это для ПЕРВИЧНОГО КЛЮЧА, который имеет тип столбца, в частности, INTEGER (зависит от регистра).

Если не использовать в этой ситуации, тогда произойдет синтаксическая ошибка.

A PRIMARY KEY является основным (для пользователя) индексом.

Если кодируется column INTEGER PRIMARY KEY, то этот столбец становится псевдонимом столбца rowid .

  • Столбец rowid (если таблица не определена с помощью ключевого слова WITHOUT ROWID) - это столбец, который нормально скрыт (например, SELECT * не возвращает rowid ). rowid является реальным первичным индексом, его значением является целое число (64-разрядное целое число со знаком), изначально 1, оно всегда уникально и, как правило, увеличивается и часто на 1).Он однозначно идентифицирует строку.

Если используется псевдоним столбца rowid , то, если при вставке строки значение не указывается, это будет автоматически сгенерированное значение в соответствии с rowid если указано значение, строка будет вставлена ​​с этим значением.Отмечая, что значение должно быть целым числом, и оно должно быть уникальным.

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

Если кодируется AUTOINCREMENT , более низкое значение не будет использоваться, вместо этого возникнет исключение SQLITE_FULL.

Таким образом AUTOINCREMENT дополняет INTEGER PRIMARY KEY, чтобы наложить ограничение на то, что уникальное значение всегда должно увеличиваться.Он делает это за определенную плату, так как использует таблицу с именем sqlite_sequence для хранения самого высокого выделенного значения rowid (или его псевдонима).

Таким образом, учитывайте следующее: -

DROP TABLE IF EXISTS aifill;
DROP TABLE IF EXISTS noaifill;
CREATE TABLE noaifill (ID INTEGER PRIMARY KEY);
CREATE TABLE aifill (ID INTEGER PRIMARY KEY AUTOINCREMENT);

INSERT INTO aifill VALUES (null),(null),(null),(null);
INSERT INTO noaifill VALUES (null),(null),(null),(null);
SELECT * FROM aifill JOIN noaifill ON aifill.ID = noaifill.ID;

INSERT INTO aifill VALUES(9223372036854775807);
INSERT INTO noaifill VALUES(9223372036854775807);
SELECT * FROM aifill JOIN noaifill ON aifill.ID = noaifill.ID;

INSERT INTO noaifill VALUES(null);
SELECT * FROM noaifill;

INSERT INTO aifill VALUES(null); -- <<<<<<<<<< FAILS
SELECT * FROM aifill JOIN noaifill ON aifill.ID = noaifill.ID;

Тогда получаются следующие результаты: -

enter image description here

enter image description here

enter image description here

Сообщения: -

DROP TABLE IF EXISTS aifill
> OK
> Time: 0.351s


DROP TABLE IF EXISTS noaifill
> OK
> Time: 0.312s


CREATE TABLE noaifill (ID INTEGER PRIMARY KEY)
> OK
> Time: 0.266s


CREATE TABLE aifill (ID INTEGER PRIMARY KEY AUTOINCREMENT)
> OK
> Time: 0.299s


INSERT INTO aifill VALUES (null),(null),(null),(null)
> Affected rows: 4
> Time: 0.262s


INSERT INTO noaifill VALUES (null),(null),(null),(null)
> Affected rows: 4
> Time: 0.273s


SELECT * FROM aifill JOIN noaifill ON aifill.ID = noaifill.ID
> OK
> Time: 0s


INSERT INTO aifill VALUES(9223372036854775807)
> Affected rows: 1
> Time: 0.366s


INSERT INTO noaifill VALUES(9223372036854775807)
> Affected rows: 1
> Time: 0.291s


SELECT * FROM aifill JOIN noaifill ON aifill.ID = noaifill.ID
> OK
> Time: 0s


INSERT INTO noaifill VALUES(null)
> Affected rows: 1
> Time: 0.259s


SELECT * FROM noaifill
> OK
> Time: 0s


INSERT INTO aifill VALUES(null)
> database or disk is full
> Time: 0s
0 голосов
/ 25 сентября 2018

Эти атрибуты относятся к SQLite.NET

  • [PrimaryKey] - Этот атрибут можно применить к целочисленному свойству, чтобы он стал первичным ключом базовой таблицы.Составные первичные ключи не поддерживаются.

  • [AutoIncrement] - этот атрибут приведет к автоматическому приращению значения целочисленного свойства для каждого нового объекта, вставленного в базу данных

SQLite.NET

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