C# 创建一个';非空';不指定默认值的SQLite列

C# 创建一个';非空';不指定默认值的SQLite列,c#,sqlite,C#,Sqlite,我试图从一个C#WinForms应用程序中创建一个SQLite数据库。我正在使用System.Data.SQLite库 我可以很好地创建数据库,也可以很好地创建表。当我需要添加一个新列时,问题就出现了,我不想允许空值,但也不想指定默认值 为了创建表,我将使用如下查询: CREATE TABLE MyTable (ID INTEGER PRIMARY KEY AUTOINCREMENT) 然后运行此查询时出现问题: ALTER TABLE MyTable ADD COLUMN Col1 nvar

我试图从一个C#WinForms应用程序中创建一个SQLite数据库。我正在使用
System.Data.SQLite

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

为了创建表,我将使用如下查询:

CREATE TABLE MyTable (ID INTEGER PRIMARY KEY AUTOINCREMENT)
然后运行此查询时出现问题:

ALTER TABLE MyTable ADD COLUMN Col1 nvarchar NOT NULL
这会产生以下错误:

SQL逻辑错误或缺少数据库,无法使用添加非空列 默认值为空

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

我还可以使用单独的工具(SQLiteStudio)手动向数据库添加NOTNULL列,而不使用默认值


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

尽管SQLite支持更改表,但它只支持一小部分命令。这意味着不可能直接修改表以添加具有任何特定约束的列

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

CREATE TABLE MyTable (
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    Col1 nvarchar NOT NULL
)
这对我需要做的事情非常有效。幸运的是,我的需求是在创建表之后直接添加列,因此不需要太多的代码重写就可以将整个过程(创建表和列)合并到单个查询中


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

,在“进行其他类型的表架构更改”部分中


我知道现在回答这个问题已经很晚了,一种变通方法已经被标记为答案,但我今天遇到了这个问题,表格中有很多数据需要来回复制

我想出了一个解决这个错误的简单方法。由于错误说明它无法创建默认值为NULL的NOTNULL列,因此我决定尝试提供一个默认值。它就像一个符咒

例如,来自原始问题的查询如下所示

ALTER TABLE MyTable ADD COLUMN Col1 nvarchar NOT NULL DEFAULT ''
如果列为整数,则可以提供类似于0的默认值


我希望这能帮助别人。

@Jon:你能解释一下你认为是重复问题的答案在哪里吗?我不熟悉RubyonRailsi,但我不确定当SQLite根本不支持您想要的东西时,您希望得到什么样的帮助。。。。或者,除非它在幕后采用通常推荐的方法,即使用所需的列创建一个新表,重命名和复制数据(如果有)。你可以坚持“必须”,但SQLite文档不同意你的观点,他们会赢得争论。请参阅,例如,-这里他们这样做是为了更改列,但是可以使用相同的方法添加一个NOTNULL、NODEFAULT列。所以,是的,如果我们真的“不知何故”,你仍然是对的。同时,您想要的
altertable
行为仍然不存在。在创建表时,由于还没有数据,因此不需要默认值。更改时,您需要考虑零行或多行(语法需要在不检查行数的情况下工作),这些行的新列需要值。由于您使用的是SQLiteStudio,因此启用正在执行的SQL的调试可能会很有用,因此,您可以从SQLiteStudio进行修改,并使用应用程序生成的就绪SQL查询。下面是一些关于如何启用调试的详细信息:@Googie:很遗憾,我无法获得调试控制台。我用
--d
ok吃午饭,但是按
F12
没有效果。其他功能键也不起任何作用(F2用于设置除外)。我使用的是v2.1。5@Googie:它与
sqlitestudio-2.1.5.exe--debug
。。。我在窗户上。感谢您提供的信息
F12
技巧仅适用于Windows。如果您使用的是Unix/Linux,它会有点复杂,如果您愿意,我们可以把它带到聊天室。