2

我有一个SQLite文件,我想添加2550 empty (NULL)行。

我可以用这段代码添加一个空行

INSERT INTO my_table DEFAULT VALUES

但我需要 2550 行。有什么捷径吗?我不想执行相同的代码 2550 次。

4

3 回答 3

4

如果您的 SQLite 版本支持它,您可以使用递归 CTE 生成从 1 到 2550 的序列,然后沿该序列插入“空”记录:

WITH RECURSIVE generate_series(value) AS (
    SELECT 1
    UNION ALL
    SELECT value + 1
    FROM generate_series
    WHERE value + 1 <= 2550
)

INSERT INTO yourTable (col1, col2, ...)
SELECT NULL, NULL, ...
FROM generate_series;

目前尚不清楚您要为实际插入指定哪些值(如果有)。如果您在插入中省略了任何列,则默认情况下 SQLite 应分配NULL或为该列定义任何默认值。

于 2020-12-24T13:50:12.687 回答
2

如果您的表为空,则使用递归CTE获取 2550 行,每行由 1 到 2550 的整数组成,并使用它们插入 2550 行:

WITH cte AS (
  SELECT 1 nr
  UNION ALL
  SELECT nr + 1
  FROM cte
  WHERE nr < 2550
)
INSERT INTO my_table(rowid)
SELECT nr FROM cte 

这样,您将使用将存储rowid整数值的列,CTE并且无需在INSERT语句中枚举表的所有列。
这些列将获得它们的默认值。

如果您的表不为空,您可以通过从表中的最大值开始整数rowid+1 以类似的方式执行此操作:

WITH cte AS (
  SELECT MAX(rowid) + 1 nr FROM my_table
  UNION ALL
  SELECT nr + 1
  FROM cte
  WHERE nr < (SELECT MAX(rowid) + 2550 FROM my_table)
)
INSERT INTO my_table(rowid)
SELECT nr FROM cte

查看简化的演示(5 行)。

但是由于您还标记android-sqlite了您可以使用for循环:

for (int i = 1; i <= 2550; i++) {
    db.execSQL("INSERT INTO my_table DEFAULT VALUES");
}

其中db是 的有效非空实例SQLiteDatabase

于 2020-12-24T14:26:50.057 回答
1

您可以使用递归 CTE 生成数字,然后插入 . . . 但您需要更明确地了解要插入的值:

with cte as (
      select 1 as n
      union all
      select n + 1
      from cte
      where n < 2550
     )
insert into mytable (<something>)
    select <something>
    from cte;

我认为您需要为 SQLite 中的至少一列指定值。

于 2020-12-24T13:50:06.647 回答