如何使用默认值在 SQLite 中插入行?

How to insert rows in SQLite using default values?

更新:

以下是我从以下答案中了解到的...

SQLite 支持在列上定义默认值。但是,它不支持查询中任何形式的 DEFAULT 关键字或函数。因此,实际上,不可能执行 MySQL 样式的批量插入,其中在某些行中显式设置列,而在其他行中使用列默认值。

下面列出了几种创造性的解决方法,但为了简单起见,我最喜欢 Shawn 的建议,即每行使用一个 INSERT 语句,可能全部包含在 BEGIN TRANSACTION 语句中。只有这样才能使用列默认值。


原题:

我有一个名为 todo 的简单 SQLite table,具有此模式...

我可以使用此语法向 table 中插入行...

INSERT INTO 'todo' ('title', 'complete', 'notes') VALUES
  ('Pickup dry cleaning', true, 'They close at 7pm'),
  ('Clean apartment', false, 'Floors have already been swept'),
  ('Finish homework', true, 'Chapters 3 and 4');

然而,

我不知道如何省略某些值并让数据库使用该列的默认值。

例如,complete 列的默认值为 0。能够将 undefined 作为我的查询中的值之一传递会很好,从而向 SQLite 发出信号,表明我想使用任何列默认值,但我收到 Result: no such column: undefined 错误当我尝试这个时。

null 在这种情况下也不起作用,因为有时您想将单元格的值显式设置为 null。您不能简单地省略该值,因为参数是位置性的。

您只需将其排除在插入的列之外:

INSERT INTO todo(title, notes) VALUES ('Music practice', 'Not Elvis');

Shawn 所说的加上批量问题可以用 DEFAULT 值解决,也就是说,如果您手动插入所有记录,如果您希望通过循环动态插入,例如您必须声明一个变量为默认值,如果特定值存在则更改为特定值,并在查询中使用该变量。

String var='DEFAULT';
if (Value exists) {var=Value;}

sql=inset into x(x,y,z) values (a,b,var);

I can't figure out how to omit certain values and let the database use the default for that column.

在撰写本文时,SQLite 不支持 default(_) 函数,但您可以使用触发器来实现您想要的效果,尽管这样做有点麻烦。

这是一个例子:

CREATE TRIGGER IF NOT EXISTS onnull
AFTER INSERT ON mytable
FOR EACH ROW
WHEN NEW.column = 'undefined'
BEGIN
    UPDATE mytable 
    SET column = 'mydefault' ;
END;

如果您使用的是 better-sqlite3,此方法有效,我认为它同样适用于 sqlite3。

db.prepare("INSERT INTO bugs (title, notes) VALUES (?, ?)").run(["Good Book", "nice test"]);