【发布时间】:2014-07-10 14:49:16
【问题描述】:
我正在尝试从 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 列添加到数据库中。
那么为什么我不能这样做呢?我的查询有问题吗?
【问题讨论】:
-
@Jon:您能否准确解释一下您认为重复的问题中的解决方案在哪里?我不熟悉 ruby on rails
-
我做到了,但是当 SQLite 根本不支持你想要的东西时,我不确定你期望什么样的帮助。
-
... 或者,除非在幕后,它采用经常推荐的方法,即使用您想要的列创建一个新表,重命名和复制数据(如果有的话)。你可以坚持“它必须”,但 SQLite 文档不同意你的观点,他们会赢得争论。 "If a NOT NULL constraint is specified, then the column must have a default value other than NULL."
-
参见,例如,stackoverflow.com/questions/805363/… - 他们这样做是为了改变一列,但同样的方法可用于添加非空、非默认列。所以,是的,如果我们 reeeeallly 伸出“不知何故”,你仍然是正确的。同时,您想要的
ALTER TABLE行为仍然不存在。 -
创建表时,没有绝对必要的默认值,因为还没有数据。更改时,您需要考虑零个或多个现有行(语法需要在不检查行数的情况下工作),其新列需要值。