【问题标题】:How to insert rows in SQLite using default values?如何使用默认值在 SQLite 中插入行?
【发布时间】:2019-11-04 14:18:05
【问题描述】:

更新:

这是我从下面的答案中学到的……

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

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


原问题:

我有一个名为 todo 的简单 SQLite 表,具有此架构...

我可以用这种语法在这个表中插入行...

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。您也不能简单地省略该值,因为参数是位置参数。

【问题讨论】:

    标签: sql sqlite default


    【解决方案1】:

    您只需将其从插入的列中删除即可:

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

    【讨论】:

    • Shawn,我想这个解决方案的问题是我认为它不适用于多行(即批量插入),在某些行中,您希望显式设置列的值,但在其他行中你想使用默认值。
    • @J.Munson 对要插入的值的不同组合使用不同的插入语句。
    • 对于其他搜索此内容的人,您可以输入所有默认值,如下所示:INSERT INTO todo DEFAULT VALUES;
    【解决方案2】:

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

    在撰写本文时,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;
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        String var='DEFAULT';
        if (Value exists) {var=Value;}
        
        sql=inset into x(x,y,z) values (a,b,var);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-02
          • 2012-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-06
          • 2013-01-14
          相关资源
          最近更新 更多