在以下代码中,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; }
}
}
答案 0 :(得分:0)
这些属性来自SQLite.NET
[PrimaryKey]
–该属性可以应用于整数属性,以强制其成为基础表的主键。不支持复合主键。
[AutoIncrement]
–此属性将使插入数据库中的每个新对象的整数属性值自动递增
答案 1 :(得分:0)
AUTOINCREMENT 是一个互补关键字,只能在一种情况下使用,它是针对PRIMARY KEY的,该PRIMARY KEY的列类型专门为INTEGER(视情况而定)。
如果在这种情况下不使用,则会发生语法错误。
主键是主要索引(就用户而言)。
如果将column INTEGER PRIMARY KEY
编码为该列,则该列将成为 rowid 列的别名。
如果使用了 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;
那么结果是:-
消息:-
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