在不指定默认值的情况下创建“NOT NULL”SQLite列

时间:2014-07-10 14:49:16

标签: c# sqlite

我正在尝试从C#WinForms应用程序中创建一个SQLite数据库。我使用的是System.Data.SQLiteas found on sqlite.org

我可以很好地创建数据库,我也可以创建表格。当我需要添加一个我不想允许空值的新列时,问题出现了,但我也不想指定默认值。

为了创建表格,我会使用如下的查询:

CREATE TABLE MyTable (ID INTEGER PRIMARY KEY AUTOINCREMENT)

然后我运行此查询时出现问题:

ALTER TABLE MyTable ADD COLUMN Col1 nvarchar NOT NULL

这会产生以下错误:

  

SQL逻辑错误或缺少数据库无法添加NOT NULL列   默认值NULL

我理解为什么如果表包含数据,这可能是一个问题,但所有表都是空的(它们刚刚创建)。

我还可以使用单独的工具(SQLiteStudio)手动将没有默认值的NOT NULL列添加到数据库中。

那为什么我不能这样做?我的查询有问题吗?

2 个答案:

答案 0 :(得分:6)

虽然SQLite支持更改表,但它只支持一小部分命令。这意味着无法直接更改表以添加具有任何特定约束的列。

但是,如果在最初创建表时指定了它们,则可以指定所需的任何列约束。例如:

CREATE TABLE MyTable (
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    Col1 nvarchar NOT NULL
)

这非常适合我需要做的事情。我很幸运,我的要求是在创建表后直接添加列,因此不需要太多的代码重写就可以将整个过程(创建表和列)合并到一个查询中。


如果要求是更改现有表并添加新列,那么它会更加棘手,但仍然可行。这里的解决方案是重命名当前表(作为临时),创建一个具有新列的新表(带有原始表名),然后将临时表中的数据复制到新表中,最后删除临时表表

This process is described here,在“制作其他类型的表架构更改”部分中。

Here is a potential solution for doing this

答案 1 :(得分:0)

我知道回答这个问题已经很晚了,并且已经将一些工作标记为答案,但我今天遇到了这个问题,并且该表有很多数据要来回复制。

我开发了一个简单的错误解决方案。由于错误表示无法使用默认值NULL创建NOT NULL列,因此我决定尝试提供默认值。它就像一个魅力。

例如,原始问题的查询看起来像

ALTER TABLE MyTable ADD COLUMN Col1 nvarchar NOT NULL DEFAULT ''

如果列是整数,则可以提供类似0的默认值。

我希望这有助于某人。