是否可以在单个查询中将x个缺省值插入空SQLLite表中?

时间:2016-09-08 07:47:24

标签: sqlite

我想将带有默认值的约100,000行插入到SQLLite数据库中,我想让引擎工作而不是在Python中循环迭代。

对于使用默认值进行插入,the doc可以这样说:

  

INSERT语句的第三种形式是DEFAULT VALUES。 INSERT ... DEFAULT VALUES语句将一个新行插入到命名表中。新行的每一列都使用其默认值填充,如果在CREATE TABLE语句中未指定默认值作为列定义的一部分,则填充NULL。

这似乎没有用,所以我想我可以使用 INSERT INTO ... SELECT

  

INSERT语句的第二种形式包含SELECT语句而不是VALUES子句。对于通过执行SELECT语句返回的每行数据,将新条目插入表中。如果指定了列列表,则SELECT结果中的列数必须与列列表中的项目数相同。否则,如果未指定column-list,则SELECT结果中的列数必须与表中的列数相同。任何SELECT语句,包括具有ORDER BY和/或LIMIT子句的复合SELECT和SELECT语句,都可以在此表单的INSERT语句中使用。

但是,我无法想出一种方法,可以在一个空表上使select语句返回100,000结果,以便在INSERT INTO ... SELECT语句中使用。 SQLite expressions上的文档没有给我任何线索。

有没有一个聪明的解决方案,而不是用Python强制它?

1 个答案:

答案 0 :(得分:1)

在关系数据库中使多个具有相同值的行没有意义。

无论如何,获取所有实际列的默认值的另一种方法是将NULL插入内部rowid column。 要凭空创建行,您需要recursive common table expression

INSERT INTO MyTable(rowid)
WITH RECURSIVE n(r) AS (
    SELECT NULL
    UNION ALL
    SELECT NULL FROM n
    LIMIT 100000
)
SELECT r FROM n;