【问题标题】:What's an easy way to populate a database through an sql query from a single entry?什么是通过单个条目的 sql 查询填充数据库的简单方法?
【发布时间】:2026-01-19 04:35:01
【问题描述】:

我们希望填充多个表以进行测试。除了时间戳列之外,数据都可以相同。该行中的其他列包含复杂的数据,例如 xml 格式的对象和其他杂乱的东西,所以我们不想重新制作它。 通过 sql 查询将时间戳增加一个恒定的间隔,将单个条目扩展到数千个条目是一种简单的方法。

我们当前的想法(在 C 风格的伪代码中)是:

Get the latest (likely only) row and store it in a variable "thisRow"
While(thisRow->time < endTime)
{
Increment thisRow->time by a constant variable
Insert thisRow
}

我们正在使用 postgres

【问题讨论】:

  • 请说出您使用的是哪个数据库(Oracle、MSSQL、mysql 等)。

标签: sql populate


【解决方案1】:

我喜欢在我的数据库中为某些查询保留一个 Numbers 表。如果你有一个,那么你可以使用下面的单一语句。如果您没有,很容易生成一张作为临时表或永久表。

INSERT INTO Test_Table
(
     col1,
     col2,
     ...,
     my_timestamp
)
SELECT
     ST.col1,
     ST.col2,
     ...,
     DATEADD(mi, N.number, ST.my_timestamp)
FROM
     Source_Table ST
INNER JOIN Numbers N ON
     N.number BETWEEN 1 AND 1000  -- Change this to what you want

这适用于 SQL Server。 DATEADD 函数在您的 RDBMS 中可能不同。如果您不希望间隔正好是一分钟,您也可以添加一个随机函数,当然您可以将间隔更改为小时、天或其他任何值。如果你想说每个间隔两个小时,你也可以使用一个简单的等式。

【讨论】:

  • 要添加的两个 postgres 特定技巧:DATEADD... 可以替换为 ST.timetag + CAST(textcat(text(number), text('minute')) as interval) 和 Numbers表的东西可以使用像 FROM Source_Table ST generate_series(1,10000) 这样的 generateSeries() 作为数字
【解决方案2】:

使用 SQL SERVER 2005+,您可以使用 CTE 语句

看看这个

DECLARE @StartTime DATETIME,
        @EndTime DATETIME

SELECT  @StartTime = '01 Jan 2009',
        @EndTime = '31 Jan 2009'

DECLARE @Table TABLE(
        DateVal DATETIME,
        Col1 INT
)

INSERT INTO @Table SELECT @StartTime, 1

SELECT  *
FROM    @Table

;WITH CTE AS (
        SELECT @StartTime StartTime
        UNION ALL
        SELECT  DATEADD(dd, 1, StartTime) StartTime
        FROM    CTE 
        WHERE   StartTime < @EndTime
)
SELECT  CTE.*,
        t.Col1
FROM    CTE,
        @Table t

【讨论】:

    【解决方案3】:

    如果您使用的是支持递归的数据库,例如 Microsoft SQL Server,您可以使用类似的东西:

    WITH T AS (
        SELECT 1 AS r
        UNION ALL
        SELECT r + 1 AS r
        FROM T
        WHERE r < 100 -- Or however many rows you need
    )
    INSERT INTO TestTable (Col1, Col2,...)
    SELECT s.Col1, s.Col2,...
    FROM SourceTable s
        CROSS JOIN T
    

    【讨论】:

    • 其实递归只能做100级。
    • 您可以做的不止这些……这只是默认限制。将 OPTION(MAXRECURSION 0) 添加到末尾。