在SQLite中:
如果表包含INTEGER PRIMARY KEY类型的列,则该列将成为ROWID的别名。
当一个新行插入到SQLite表中时,ROWID既可以指定为INSERT语句的一部分,也可以由数据库引擎自动指定。
如果在插入上没有指定ROWID,或者指定的ROWID的值为NULL,则会自动创建适当的ROWID。
我在SQLite中创建了一个带有整数主键的表,然后在LINQPad中打开该文件。我试图通过C#:
在表格中插入一个新行var episode = new RateableItem()
{
SourceId = "tal",
Edition = episodeNum.ToString(),
Name = episodeName,
Consumed = false
};
RateableItems.InsertOnSubmit(episode);
SubmitChanges();
在上面的例子中,我还没有指定pimary键。这会失败,因为LINQPad已将主键映射到不可为空的int,因此生成的SQL会在主键中插入0,但由于已存在PK 0的行,因此会失败。
有没有办法用SQLite配置LINQPad,以便为PK传递空值,允许SQLite自动分配PK值?
答案 0 :(得分:2)
感谢@sgmoore在评论中发布的示例数据库,我能够找到声明表主键,因为AUTOINCREMENT解决了我的问题。
CREATE TABLE RateableItem (
RateableItemId INTEGER PRIMARY KEY AUTOINCREMENT,
SourceId NVARCHAR(32) NOT NULL,
Name NVARCHAR(255),
Edition NVARCHAR(16),
Consumed BOOLEAN NOT NULL
);
当我将AUTOINCREMENT添加到我的表定义时,我能够在不指定键的情况下创建新对象。 LINQPad的Schema Explorer没有显示与AUTOINCREMENT和不使用AUTOINCREMENT的主键之间的任何区别,但是我的脚本编译并且SQLite在SubmitChanges()
上分配了一个值。
主要行为与AUTOINCREMENT存在一些差异。幸运的是,在我的场景中这些都很好。
答案 1 :(得分:0)
var episode = new RateableItem()
{
PrimaryKey = null,
SourceId = "tal",
Edition = episodeNum.ToString(),
Name = episodeName,
Consumed = false
};
这是如何运作的?