SQLITE - 在 INSERT 上设置默认值

Posted

技术标签:

【中文标题】SQLITE - 在 INSERT 上设置默认值【英文标题】:SQLITE - Setting default value on INSERT 【发布时间】:2016-05-24 21:14:39 【问题描述】:

如果用户不存在,我需要创建一个语句,将用户添加到我的 SQLite 数据库中,否则更新其值并将 1 添加到他之前的 totalMessages。 到目前为止,我写了这个:

INSERT OR REPLACE INTO users (id, username, first, last, totalMessages) values (
'hisID',
'hisName',
'hisFirst',
'hisLast',
(SELECT totalMessages FROM users WHERE id = 'hisID') +1);

当用户已经存在时它工作正常,但当它不存在时,totalMessages 的值设置为 NULL,我需要它为 0。

这是我的用户表:

CREATE TABLE IF NOT EXISTS users  (
id VARCHAR(255) PRIMARY KEY,
username VARCHAR(255), 
first VARCHAR(255),
last VARCHAR(255),
totalMessages INTEGER)

谁能告诉我怎么做?

更新:我尝试按照 Scott 的建议使用“DEFAULT '0'”和“DEFAULT 0”,但它仍然将 totalMessages 保存为 NULL。

你可以看到它,测试是here。

【问题讨论】:

为什么这需要是一个单一的语句? 【参考方案1】:

您的表定义应包含totalMessages 列的默认值。

CREATE TABLE IF NOT EXISTS users  (
...
totalMessages INTEGER DEFAULT '0')

SQLite 不允许在修改表时更改列,但是有一些手动执行此操作的策略,已记录在:“SQLite Modify Column”和“SQLite - alter a table's column type?”

【讨论】:

我知道 SQLite 对它提供的数据并不严格,所以我相当肯定我列为 '0' 的默认值会起作用,但我不确定它是否可以一直是0,如果这样会更好。 totalMessages 仍然是 NULL 这样做,可能是因为 SELECT 的返回值是 null,我不确定【参考方案2】:

我想我找到了解决问题的方法,虽然它可能不是最好的,但它确实有效。

REPLACE INTO users (id, username, first, last, totalMessages) values (
'hisID',
'hisName',
'hisFirst',
'hisLast',
CASE WHEN (SELECT totalMessages FROM users WHERE id = 'hisID') IS NULL THEN
  0
ELSE
  (SELECT totalMessages FROM users WHERE id = 'hisID') +1
END);

如果有人有更好的解决方案,请回答。

【讨论】:

以上是关于SQLITE - 在 INSERT 上设置默认值的主要内容,如果未能解决你的问题,请参考以下文章

SQLite3 INSERT 查询上的随机语法错误

在 INSERT 上使用正确的数据类型 Flutter SQLite 数据类型不匹配

是否可以在单个查询中将 x 个默认值插入到空 SQLite 表中?

SQLite3 笔记

SQLite进阶-17.视图

为啥 UPSERT 执行 DELETE 和 INSERT 而不是 UPDATE (SQLite)