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

mlmc2os5  于 2023-03-19  发布在  SQLite
关注(0)|答案(4)|浏览(200)

更新日期:

以下是我从下面的答案中学到的...
SQLite支持在列上定义默认值。但是,它不支持查询中任何形式的DEFAULT关键字或函数。因此,实际上,不可能执行MySQL风格的批量插入,即在某些行中显式设置列,而在其他行中使用列默认值。
下面列出了几种创造性的解决方法,但为了简单起见,我更喜欢Shawn的建议,即每行使用一个INSERT语句,可能所有语句都被 Package 在开始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,你也不能简单地省略这个值,因为参数是有位置的。

rdrgkggo

rdrgkggo1#

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

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

o2g1uqev2#

我不知道如何省略某些值并让数据库使用该列的默认值。
在撰写本文时,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;

--
脚注:可通过以下方式确定默认值:

SELECT dflt_value
FROM pragma_table_info('mytable')
WHERE name = 'column';

因此,使用WITH,您可以有蛋糕吃:

WITH def AS (SELECT … )
…… ;
ct3nt3jp

ct3nt3jp3#

如果您使用的是更好的sqlite3,这是可行的,而且我认为它同样适用于sqlite3。

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

68de4m5k4#

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

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

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

相关问题