【问题标题】:Adding NOT NULL column to SQLite table with references使用引用将 NOT NULL 列添加到 SQLite 表
【发布时间】:2014-08-22 19:59:48
【问题描述】:

我需要在我现有的 SQLite 表中添加一个列,该表引用另一个表中的列。我使用命令

ALTER TABLE users 
 ADD COLUMN dayChoice_id INTEGER 
             NOT NULL REFERENCES dayChoice(dayChoice_id) DEFAULT 0

我收到错误“无法添加具有非 NULL 默认值的 REFERENCES 列”。真的吗?那我该如何添加列呢?

【问题讨论】:

  • @KonstantinV.Salikhov,这与我遇到的问题正好相反。在他们的情况下,默认值为 NULL。添加带有 NULL 的列没有问题。但我想让它非 NULL,特别是 DEFAULT 0。
  • 可能错误是因为参考表-“dayChoice”中的列-“dayChoice_id”为空?
  • dayChoice_id 已定义 - “dayChoice_id INTEGER PRIMARY KEY”。我不认为主键可以为空,对吧?
  • @Dan-Goodspeed:在 SQLite 中,主键可以包含 NULL,除了某些特定情况: 根据 SQL 标准,PRIMARY KEY 应该始终暗示 NOT NULL。不幸的是,由于一些早期版本中的错误,SQLite 并非如此。除非该列是 INTEGER PRIMARY KEY 或该表是 WITHOUT ROWID 表或该列被声明为 NOT NULL,否则 SQLite 允许 PRIMARY KEY 列中包含 NULL 值。(更多详细信息请参见:sqlite.org/lang_createtable.html

标签: sql sqlite


【解决方案1】:

您需要在执行此ALTER 语句时禁用外键强制,如下所示:

PRAGMA foreign_keys = 0;
ALTER TABLE users ADD COLUMN dayChoice_id INTEGER
            NOT NULL REFERENCES dayChoice(dayChoice_id) DEFAULT 0;
PRAGMA foreign_keys = 1;

【讨论】:

  • 做到了!谢谢!
【解决方案2】:

来自docs

如果启用了外键约束并添加了带有 REFERENCES 子句的列,则该列的默认值必须为 NULL。

您提供的默认值不是 NULL。

它与另一个要求不兼容:

如果指定了 NOT NULL 约束,则该列必须具有 NULL 以外的默认值。

您可以通过在ALTER TABLE 之前暂时禁用外键约束来解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 2022-12-23
    相关资源
    最近更新 更多