是否可以在单个查询中将 x 个默认值插入到空 SQLite 表中?

Posted

技术标签:

【中文标题】是否可以在单个查询中将 x 个默认值插入到空 SQLite 表中?【英文标题】:Is it possible to insert x number of default values into an empty SQLLite table in a single query? 【发布时间】:2016-09-08 07:47:23 【问题描述】:

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

对于使用默认值插入,the doc 有这样的说法:

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

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

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

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

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

【问题讨论】:

【参考方案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;

【讨论】:

太好了,我试试看!

以上是关于是否可以在单个查询中将 x 个默认值插入到空 SQLite 表中?的主要内容,如果未能解决你的问题,请参考以下文章

PDO Prepared在单个查询中插入多行

在单个查询中将 SQL 关系插入到 2 个表,而不使用 mysql_insert_id()

是否可以在 Oracle 中将表中的一行作为 DML(插入、更新)返回?

是否可以在sql中使用insert插入多个值

在jdbc中的单个事务中将数据插入多个表中

是否可以在大文本通知中将扩展通知设置为默认值?