SQLite:插入身份列

Posted

技术标签:

【中文标题】SQLite:插入身份列【英文标题】:SQLite: Insert Into Identity Column 【发布时间】:2012-09-28 22:38:06 【问题描述】:

我是 SQLite 新手,我正在尝试运行以下代码:

using (var cn = new SQLiteConnection("Data Source=:memory:;Version=3;")) 
    cn.Open();

    var cmd = cn.CreateCommand();
    cmd.CommandText = "CREATE TABLE [ContentItems] ([Id] [int] IDENTITY(1,1) NOT NULL, [Title] [nvarchar](100) NOT NULL, CONSTRAINT [PK_ContentItems] PRIMARY KEY ([Id]))";
    cmd.ExecuteNonQuery();

    var cmd2 = cn.CreateCommand();
    cmd2.CommandText = "INSERT INTO [ContentItems] (Title) VALUES ('Test 1')";
    cmd2.ExecuteNonQuery();

但这给出了错误:

由于违反约束而中止 ContentItems.Id 可能不为 NULL

我查看了文档,但根据我过去的 SQL 经验,我看不出为什么这不起作用。我会很感激帮助。谢谢

【问题讨论】:

您忘记了自动递增位 在 SQLite 中通常不需要显式的自动递增 ID 列:sqlite.org/autoinc.html 【参考方案1】:

SQLite 使用 AUTOINCREMENT 关键字创建您认为的 IDENTITY 列。在您的示例中,ID 列不是使用 AUTOINCREMENT 创建的,并且由于它被声明为 NOT NULL,因此您必须提供一个值。

您所追求的 CREATE 语句是:

 CREATE TABLE [ContentItems] (
    [Id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
    [Title] TEXT NOT NULL, 
    CONSTRAINT [PK_ContentItems] PRIMARY KEY ([Id])
 )

请注意,SQLite 使用 TEXT 数据类型(尽管它会将包含“CHAR”的任何内容映射到该数据类型)并且不需要或遵守最大字段长度。

【讨论】:

谢谢,这可以解释为什么我在 IDENTITY 上找不到任何文档。

以上是关于SQLite:插入身份列的主要内容,如果未能解决你的问题,请参考以下文章

在sqlite的表中插入新列?

在 SQLite 中插入或更新

为啥我在sqlite数据库中插入数据后罗列列中没有自动增长码自动增长码是空的

在sqlite中插入大量数据

SQLite 约束

如果列结果为空,C++ SQLite 停止错误