如何在SQL中生成1000条测试用系列数据?
嘿,我来给你几个不同数据库环境下生成1000条Product1到Product1000测试数据的实用方案,你可以根据自己用的数据库选对应的写法~
针对不同数据库的解决方案
MySQL/MariaDB(8.0及以上版本)
如果你的数据库支持递归CTE(Common Table Expression),用这个写法最直观:
WITH RECURSIVE product_list AS ( -- 起始行:生成第一条Product1 SELECT 1 AS num, CONCAT('Product', 1) AS product_name UNION ALL -- 递归生成后续的ProductN,直到num达到1000 SELECT num + 1, CONCAT('Product', num + 1) FROM product_list WHERE num < 1000 ) -- 输出所有产品名,要是想插入表的话,把SELECT改成INSERT INTO your_table (column_name) SELECT ... SELECT product_name FROM product_list;
PostgreSQL
PostgreSQL有个超方便的generate_series函数,一行就能搞定:
-- 直接生成1到1000的数字,拼接成ProductN SELECT CONCAT('Product', generate_series(1, 1000)) AS product_name; -- 如果要插入到表中,直接套INSERT语句 -- INSERT INTO your_table (column_name) SELECT CONCAT('Product', generate_series(1, 1000));
当然你也可以用递归CTE,写法和MySQL类似,但generate_series显然更简洁。
SQL Server
SQL Server的递归CTE需要注意设置递归深度(默认是100,超过要手动指定):
WITH product_list AS ( SELECT 1 AS num, 'Product' + CAST(1 AS VARCHAR(4)) AS product_name UNION ALL SELECT num + 1, 'Product' + CAST(num + 1 AS VARCHAR(4)) FROM product_list WHERE num < 1000 ) SELECT product_name FROM product_list OPTION (MAXRECURSION 1000); -- 必须设置,否则会因为递归深度不够报错 -- 另一种方法是用系统表生成数字,适合低版本SQL Server -- SELECT 'Product' + CAST(number AS VARCHAR(4)) AS product_name -- FROM master..spt_values -- WHERE type = 'P' AND number BETWEEN 1 AND 1000;
Oracle
Oracle用CONNECT BY语法可以快速生成序列数据:
-- 利用LEVEL伪列生成1到1000的数字,拼接成ProductN SELECT 'Product' || LEVEL AS product_name FROM dual CONNECT BY LEVEL <= 1000; -- 插入表的写法: -- INSERT INTO your_table (column_name) SELECT 'Product' || LEVEL FROM dual CONNECT BY LEVEL <= 1000;
额外需求:生成一行包含所有ProductN(用空格分隔)
如果你不是要1000条单独的记录,而是要一行里把Product1 Product2 ... Product1000全部列出来,那可以用字符串聚合函数:
- MySQL/MariaDB:用
GROUP_CONCAT
WITH RECURSIVE product_list AS ( SELECT 1 AS num, CONCAT('Product', 1) AS product_name UNION ALL SELECT num + 1, CONCAT('Product', num + 1) FROM product_list WHERE num < 1000 ) SELECT GROUP_CONCAT(product_name SEPARATOR ' ') AS all_products FROM product_list;
- PostgreSQL:用
STRING_AGG
SELECT STRING_AGG(CONCAT('Product', generate_series(1, 1000)), ' ') AS all_products;
- SQL Server:用
STRING_AGG
WITH product_list AS ( SELECT 1 AS num, 'Product' + CAST(1 AS VARCHAR(4)) AS product_name UNION ALL SELECT num + 1, 'Product' + CAST(num + 1 AS VARCHAR(4)) FROM product_list WHERE num < 1000 ) SELECT STRING_AGG(product_name, ' ') AS all_products FROM product_list OPTION (MAXRECURSION 1000);
- Oracle:用
LISTAGG
SELECT LISTAGG('Product' || LEVEL, ' ') WITHIN GROUP (ORDER BY LEVEL) AS all_products FROM dual CONNECT BY LEVEL <= 1000;
内容的提问来源于stack exchange,提问作者Pankaj_S
相关产品推荐
相关产品推荐

