【问题标题】:Creating a 'NOT NULL' SQLite column without specifying a default value在不指定默认值的情况下创建“NOT NULL”SQLite 列
【发布时间】:2014-07-10 14:49:16
【问题描述】:

我正在尝试从 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 列添加到数据库中。

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

【问题讨论】:

  • @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 行为仍然不存在。
  • 创建表时,没有绝对必要的默认值,因为还没有数据。更改时,您需要考虑零个或多个现有行(语法需要在不检查行数的情况下工作),其新列需要值。

标签: c# sqlite


【解决方案1】:

虽然 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

【讨论】:

  • 由于您使用的是 SQLiteStudio,因此启用对正在执行的 SQL 的调试可能对您很有用,因此您可以从 SQLiteStudio 进行修改并使用由应用程序生成的现成 SQL 查询。以下是有关如何启用调试的一些详细信息:forum.sqlitestudio.pl/viewtopic.php?f=11&t=349
  • @Googie:很遗憾,我无法获得调试控制台。我与-- -d 共进午餐,好的,但随后按F12 无效。其他功能键也没有任何作用(设置 F2 除外)。我正在使用 v2.1.5
  • @Googie:它适用于 sqlitestudio-2.1.5.exe --debug ... 和我在 Windows 上。感谢您的信息
  • F12 技巧仅适用于 Windows。如果您使用的是 Unix/Linux,它会稍微复杂一些,如果您愿意,我们可以拿它来聊天。
【解决方案2】:

我知道回答这个问题已经很晚了,并且已经将一种解决方法标记为答案,但是我今天遇到了这个问题,并且该表有很多数据可以来回复制。

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

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

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

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

我希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2016-03-13
    • 1970-01-01
    • 2011-03-02
    • 2014-01-16
    • 2012-01-18
    • 2014-11-19
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多