sqlite NOT NULL约束对不存在的临时表失败

k4aesqcs  于 2023-06-23  发布在  SQLite
关注(0)|答案(1)|浏览(147)

我正在用nodejs nestjs typeorm构建一些东西,并使用sqlite进行存储。一切都很好,但现在我想向一个表中添加一个非空的列。
我将列添加到实体文件中,并让nestjs为我生成该列,但我得到错误消息QueryFailedError: SQLITE_CONSTRAINT: NOT NULL constraint failed: temporary_MyTable.deleted。(注:表名为MyTable,不知道‘临时’从何而来)
所以我确实删除了该表中的每个条目,并再次运行该程序,之后生成了该列。我确实通过程序将几行安全保存到表中,并查看了DB,发现我的新列中确实有数据。
但现在奇怪的部分来了。当现在重新启动程序时,它不会启动,并且还会给予我错误消息:QueryFailedError: SQLITE_CONSTRAINT: NOT NULL constraint failed: temporary_MyTable.deleted。现在查看数据库时,在程序尝试启动后,deleted的所有数据字段现在都是null。我在程序开始时不向数据库写入任何数据...
所以接下来我尝试删除整个DB,让nestjs从头开始生成它。这在第一次启动时确实有效,我向该表写入了一些数据。重新启动后,我仍然会得到QueryFailedError: SQLITE_CONSTRAINT: NOT NULL constraint failed: temporary_MyTable.deleted错误消息,但这次列不是null,但仍然包含正确的数据。
那张table有什么问题吗?我错过了什么?

@Column({ select: false })
  deleted: boolean;
lztngnrs

lztngnrs1#

问题是您试图向一个已经有数据的列添加NOT NULL约束。SQLite不允许这样做,因为它需要更改所有现有行以使列具有值。
要解决此问题,您需要:

  • 在添加NOT NULL约束之前,请删除表中的所有数据。
  • 将列更改为可空。

如果您想删除表中的所有数据:

DELETE FROM MyTable;

然后运行:

ALTER TABLE MyTable ADD COLUMN deleted boolean NOT NULL;

或者,创建一个临时表来保护所有数据,然后使用default语句将表列更改为非空,然后将该数据复制到表中。

相关问题