前言
SQL 造数即生成测试数据,一般是编码完成之后的测试阶段所需,测试数据可以用于多种目的,包括测试应用程序的功能、业务场景测试、性能测试、数据恢复测试等。在测试阶段特别是数据类需求,需要很多造数场景,像 Hive、Impala 这些大数据组件又不能像一般的关系型数据库如 MySQL 这样可以方便的对数据进行增删改,开发人员该如何生成有效准确的测试数据进行单元自测,测试人员该如何造数、埋数,进行上下游一整条数据链路的测试并符合业务场景需要呢?以下是一些常见的SQL造数思路:
1. INSERT INTO … SELECT …
INSERT INTO … SELECT… 造数格式是最常用的,也经常用来备份数据;
如果使用 DBeaver 数据库管理工具还可以使用它的快速生成SQL语句功能。
例:
INSERT INTO world.test
(id, cust_name, city, addr, update_time, cust_id)
SELECT id, cust_name, city, addr, update_time, cust_id
FROM world.test
;
基于数据库中已有的数据记录,通过修改部分字段值来生成新的数据。
这时候如果只是希望某个值发生变化,可以直接在 SELECT 语句对应的列自定义或使用随机函数进行造数。
以 INSERT INTO … SELECT … 为例:
INSERT INTO world.test
(id, cust_name, city, addr, update_time, cust_id, data_dt)
SELECT
CAST( RAND() * 100 + 1 ) AS STRING ) AS id
, cust_name
, city, addr
, update_time
, cust_id
, CAST( '2024-08-08' AS VARCHAR(10) ) AS data_dt
FROM world.test
WHERE data_dt = '2024-09-08'
;
RAND() 或 RANDOM():生成随机数。
上面的SQL语句实现用 ‘2024-09-08’ 日期的数据生成一份 ‘2024-08-08’ 日期的数据,并且使用 rand() 函数生成1到100之间的随机整数作为 id 字段的值。
2. INSERT INTO … VALUES (…)
可以使用 INSERT INTO … VALUES 语句批量插入单行或多行数据。
插入单行:
INSERT INTO world.test
(id, cust_name, city, addr, update_time, cust_id)
VALUES('', '', '', '', CURRENT_TIMESTAMP, '')
;
插入多行:
INSERT INTO table_name VALUES
(value1_col1, value1_col2, ..., value1_colN),
(value2_col1, value2_col2, ..., value2_colN),
...,
(valueM_col1, valueM_col2, ..., valueM_colN)
;
示例 1:插入具有相同列的多行数据
假设你有一个名为 employees 的表,它有三列:id, name, salary。
INSERT INTO employees VALUES
(1, 'John Doe', 50000),
(2, 'Jane Smith', 60000),
(3, 'Jim Brown', 55000)
;
示例 2:插入具有不同列的多行数据
如果你只想插入某些列的值,可以省略其他列,但必须确保省略的列允许NULL值或者有默认值。
INSERT INTO employees (id, name) VALUES
(4, 'Alice Johnson'),
(5, 'Bob Wilson')
;
在这个例子中,我们没有为 salary 列提供值,所以它将被设置为NULL,像 MySQL 数据库有设置默认值则使用默认值。
3. 复制表备份数据
在 Impala 中,你可以使用 CREATE TABLE 语句结合 LIKE 子句来创建一个新表,其结构(包括列和数据类型)与现有表相同。这通常用于快速复制表结构,但不包括数据。
CREATE TABLE IF NOT EXISTS new_table LIKE existing_table;
如果你想创建一个新表并复制现有表的数据,可以使用 SELECT 语句与 CREATE TABLE 语句结合使用。
示例 1:使用 LIKE 子句创建表
假设你有一个名为 test 的现有表,你想创建一个具有相同结构但没有数据的新表 test_copy:
CREATE TABLE IF NOT EXISTS test_copy LIKE test;
示例 2:使用 AS SELECT 创建表并复制数据
如果你想创建一个新表 test_new 并复制 test 表的数据:
CREATE TABLE IF NOT EXISTS test_new AS SELECT * FROM test;
最后
在需求开发中,测试阶段是开发质量把关的重要一步,以上只是简单的介绍常用的生成测试数据的几种方法,具体还是要根据业务场景,数据链路优化生成测试数据流程,更好的管控程序质量、数据质量。