PrimaryKey和AutoIncrement

时间:2018-09-24 23:08:39

标签: c# sqlite

在以下代码中,PrimaryKeyAutoIncrement是什么意思?

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 :(得分:0)

这些属性来自SQLite.NET

  • [PrimaryKey] –该属性可以应用于整数属性,以强制其成为基础表的主键。不支持复合主键。

  • [AutoIncrement] –此属性将使插入数据库中的每个新对象的整数属性值自动递增

SQLite.NET

答案 1 :(得分:0)

AUTOINCREMENT 是一个互补关键字,只能在一种情况下使用,它是针对PRIMARY KEY的,该PRIMARY KEY的列类型专门为INTEGER(视情况而定)。

如果在这种情况下不使用,则会发生语法错误。

主键是主要索引(就用户而言)。

如果将column INTEGER PRIMARY KEY编码为该列,则该列将成为 rowid 列的别名。

  • rowid 列(除非表使用WITHOUT ROWID关键字定义)是通常隐藏的列(例如SELECT *不返回 rowid )。 rowid 是真正的主索引,它的值是一个最初为1的整数(64位有符号整数),它始终是唯一的,并且通常增加1)。它唯一地标识一行。

如果使用了 rowid 列的别名,则如果在插入行时未提供任何值,则根据 rowid 值将自动生成一个值提供,然后将使用该值插入行。请注意,该值必须是整数,并且必须是唯一的。

现在,如果 rowid (包括其别名)的最高值大于9223372036854754775807,则正常算法(如果未提供任何值)将尝试使用自由的较低值。 / p>

如果将 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