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 上设置默认值的主要内容,如果未能解决你的问题,请参考以下文章
在 INSERT 上使用正确的数据类型 Flutter SQLite 数据类型不匹配