我正在尝试从C#WinForms应用程序中创建一个SQLite数据库。我使用的是System.Data.SQLite
库as 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列添加到数据库中。
那为什么我不能这样做?我的查询有问题吗?
答案 0 :(得分:6)
虽然SQLite支持更改表,但它只支持一小部分命令。这意味着无法直接更改表以添加具有任何特定约束的列。
但是,如果在最初创建表时指定了它们,则可以指定所需的任何列约束。例如:
CREATE TABLE MyTable (
ID INTEGER PRIMARY KEY AUTOINCREMENT,
Col1 nvarchar NOT NULL
)
这非常适合我需要做的事情。我很幸运,我的要求是在创建表后直接添加列,因此不需要太多的代码重写就可以将整个过程(创建表和列)合并到一个查询中。
如果要求是更改现有表并添加新列,那么它会更加棘手,但仍然可行。这里的解决方案是重命名当前表(作为临时),创建一个具有新列的新表(带有原始表名),然后将临时表中的数据复制到新表中,最后删除临时表表
This process is described here,在“制作其他类型的表架构更改”部分中。
答案 1 :(得分:0)
我知道回答这个问题已经很晚了,并且已经将一些工作标记为答案,但我今天遇到了这个问题,并且该表有很多数据要来回复制。
我开发了一个简单的错误解决方案。由于错误表示无法使用默认值NULL创建NOT NULL列,因此我决定尝试提供默认值。它就像一个魅力。
例如,原始问题的查询看起来像
ALTER TABLE MyTable ADD COLUMN Col1 nvarchar NOT NULL DEFAULT ''
如果列是整数,则可以提供类似0的默认值。
我希望这有助于某人。