用户信息表建表及批量插入 100 条数据(MySQL/Oracle)
本文档提供MySQL 和Oracle 数据库下,用户信息表(users)的新建表语句 、批量插入 100 条模拟数据语句,数据格式匹配预设的用户信息规范(含编号、姓名、邮箱、手机号、银行卡等 10 个字段),语句可直接复制执行,适配主流数据库客户端(MySQL Workbench/Navicat、PL/SQL Developer/Oracle SQL*Plus)。
一、核心数据规范
- 表名:
users,共 10 个字段,字段列序固定(不可调整); - 数据量:批量插入后总数据量为 100 条,字段格式统一,手机号、银行卡号、军号、主键 ID 保证唯一不重复;
表格
| 列序 | 字段含义 | MySQL 类型 | Oracle 类型 | 说明 |
|---|---|---|---|---|
| 1 | 主键 ID | INT 自增 | NUMBER 主键 | 1-100 连续递增 |
| 2 | 姓名 | VARCHAR(20) | VARCHAR2(20) | X 小 X 格式,如陈小欢 |
| 3 | 邮箱 | VARCHAR(50) | VARCHAR2(50) | wwwX@yahoo.com 格式 |
| 4 | 随机数字 | INT | NUMBER | 1-100 随机整数 |
| 5 | 性别 | CHAR(1) | CHAR(1) | 固定 M,可改随机 M/F |
| 6 | 身份证号 | VARCHAR(18) | VARCHAR2(18) | 46002519810910 + 后 4 位随机 |
| 7 | 手机号 | VARCHAR(11) | VARCHAR2(11) | 13581696800 开始依次递增 |
| 8 | 银行卡号 | VARCHAR(16) | VARCHAR2(16) | 6225881010845071 开始依次递增 |
| 9 | 军号 | VARCHAR(20) | VARCHAR2(20) | 军字第 00111209 号开始依次递增 |
| 10 | 地址 | VARCHAR(100) | VARCHAR2(100) | 北京各区域随机选取 |
二、MySQL 数据库操作语句
2.1 新建 users 表(首次执行,已建表可跳过)
语句特点:主键 ID 自增,字段类型适配 MySQL,添加非空约束保证数据完整性,直接复制执行:
python
-- MySQL新建users表
CREATE TABLE IF NOT EXISTS users (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键自增ID',
name VARCHAR(20) NOT NULL COMMENT '姓名',
email VARCHAR(50) NOT NULL COMMENT '邮箱',
num INT NOT NULL COMMENT '随机数字',
gender CHAR(1) NOT NULL COMMENT '性别',
id_card VARCHAR(18) NOT NULL COMMENT '身份证号',
phone VARCHAR(11) NOT NULL COMMENT '11位手机号',
bank_card VARCHAR(16) NOT NULL COMMENT '16位银行卡号',
military_no VARCHAR(20) NOT NULL COMMENT '军号',
address VARCHAR(100) NOT NULL COMMENT '地址'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';
2.2 批量插入 100 条数据(无存储过程,极简版,零兼容问题)
100条版本
语句特点:无需创建存储过程,直接通过循环变量实现,按固定列序插入(规避字段名冲突),执行后直接生成 1-100 号完整数据,唯一字段依次递增不重复:
python
-- 1. 删除同名存储过程(避免冲突)
DROP PROCEDURE IF EXISTS batch_insert_100users;
-- 2. 临时修改结束符,适配存储过程
DELIMITER //
-- 3. 创建存储过程(封装循环,适配所有MySQL客户端)
CREATE PROCEDURE batch_insert_100users()
BEGIN
DECLARE i INT DEFAULT 1; -- 起始ID:1
DECLARE base_phone BIGINT DEFAULT 13581696799; -- 手机号起始值(+1后为13581696800)
DECLARE base_bank BIGINT DEFAULT 6225881010845070; -- 银行卡起始值(+1后为6225881010845071)
DECLARE base_military INT DEFAULT 111208; -- 军号后缀起始值(+1后为111209)
-- 循环插入1-100号数据
WHILE i <= 100 DO
-- 生成X小X格式姓名
SET @name=CONCAT(ELT(FLOOR(RAND()*10)+1,'陈','李','胡','张','王','刘','赵','杨','周','黄'),
ELT(FLOOR(RAND()*8)+1,'小欢','小冉','小可','小军','小芬','小玉','小琪','小宇'));
-- 生成固定格式邮箱
SET @email=CONCAT('www',FLOOR(1+RAND()*100),'@yahoo.com');
-- 生成1-100随机数字
SET @num_col=FLOOR(1+RAND()*100);
-- 生成18位身份证号(固定前缀+随机后4位)
SET @idcard=CONCAT('46002519810910',LPAD(FLOOR(1000+RAND()*9000),4,0));
-- 唯一字段依次+1,保证不重复
SET base_phone = base_phone + 1;
SET base_bank = base_bank + 1;
SET base_military = base_military + 1;
-- 生成固定格式军号
SET @mno=CONCAT('军字第',LPAD(base_military,8,0),'号');
-- 随机选取北京区域地址
SET @addr=ELT(FLOOR(RAND()*10)+1,'北京市朝阳区立水桥北','北京市朝阳区立水桥北test',
'北京市朝阳区大屯北','北京市朝阳区国贸','北京市东城培新街',
'北京市海淀区中关村','北京市西城区金融街','北京市东城区王府井',
'北京市丰台区马家堡','北京市昌平区回龙观');
-- 按列序插入,无字段名冲突
INSERT INTO users VALUES(i,@name,@email,@num_col,'M',@idcard,base_phone,base_bank,@mno,@addr);
-- 循环自增
SET i = i + 1;
END WHILE;
END //
-- 4. 恢复MySQL默认结束符
DELIMITER ;
-- 5. 调用存储过程(核心执行,生成100条数据)
CALL batch_insert_100users();
10000条的优化版本
bash
DROP PROCEDURE IF EXISTS batch_insert_10000;
DELIMITER //
CREATE PROCEDURE batch_insert_10000()
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE base_phone BIGINT DEFAULT 13581696799;
DECLARE base_bank BIGINT DEFAULT 6225881010845070;
DECLARE base_military INT DEFAULT 111208;
-- 关键:关闭自动提交,一万条才快
SET autocommit = 0;
WHILE i <= 10000 DO -- ← 这里改成 10000 就完事
SET @name = CONCAT(
ELT(FLOOR(RAND()*10)+1,'陈','李','胡','张','王','刘','赵','杨','周','黄'),
ELT(FLOOR(RAND()*8)+1,'小欢','小冉','小可','小军','小芬','小玉','小琪','小宇')
);
SET @email = CONCAT('www',FLOOR(1+RAND()*10000),'@yahoo.com');
SET @num_col = FLOOR(1+RAND()*100);
SET @idcard = CONCAT('46002519810910',LPAD(FLOOR(1000+RAND()*9000),4,0));
SET base_phone = base_phone + 1;
SET base_bank = base_bank + 1;
SET base_military = base_military + 1;
SET @mno = CONCAT('军字第',LPAD(base_military,8,0),'号');
SET @addr = ELT(FLOOR(RAND()*10)+1,
'北京市朝阳区立水桥北','北京市朝阳区国贸','北京市海淀区中关村','北京市西城区金融街'
);
INSERT INTO users VALUES (
i,@name,@email,@num_col,'M',@idcard,base_phone,base_bank,@mno,@addr
);
SET i = i + 1;
END WHILE;
COMMIT; -- 批量提交
SET autocommit = 1;
END //
DELIMITER ;
CALL batch_insert_10000();
三、Oracle 数据库操作语句
3.1 新建 users 表(首次执行,已建表可跳过)
语句特点:适配 Oracle 数据类型(VARCHAR2/NUMBER),主键 ID 非自增(由批量语句控制递增),添加非空约束,直接复制执行:
python
-- Oracle通用建表语句(适配11g/12c/19c,无语法错误)
CREATE TABLE users (
id NUMBER PRIMARY KEY, -- 主键ID(1-100递增)
name VARCHAR2(20) NOT NULL, -- 姓名
email VARCHAR2(50) NOT NULL, -- 邮箱
num_col NUMBER NOT NULL, -- 随机数字(替换原num,避免字段名冲突)
gender CHAR(1) NOT NULL, -- 性别
id_card VARCHAR2(18) NOT NULL,-- 身份证号
phone VARCHAR2(11) NOT NULL, -- 11位手机号
bank_card VARCHAR2(16) NOT NULL,-- 16位银行卡号
military_no VARCHAR2(20) NOT NULL,-- 军号
address VARCHAR2(100) NOT NULL -- 地址
);
-- 单独添加表注释(Oracle通用写法,适配所有版本)
COMMENT ON TABLE users IS '用户信息表';
-- 单独添加字段注释(可选,按需执行,不影响建表和插数)
COMMENT ON COLUMN users.id IS '主键ID(1-100递增)';
COMMENT ON COLUMN users.name IS '姓名';
COMMENT ON COLUMN users.email IS '邮箱';
COMMENT ON COLUMN users.num_col IS '随机数字';
COMMENT ON COLUMN users.gender IS '性别';
COMMENT ON COLUMN users.id_card IS '身份证号';
COMMENT ON COLUMN users.phone IS '11位手机号';
COMMENT ON COLUMN users.bank_card IS '16位银行卡号';
COMMENT ON COLUMN users.military_no IS '军号';
COMMENT ON COLUMN users.address IS '地址';
3.2 批量插入 100 条数据(原生 PL/SQL,无自定义函数,零依赖)
语句特点:采用 Oracle 原生 PL/SQL 块 + FOR 循环,无任何自定义函数,按固定列序插入(规避字段名冲突),显式提交事务保证数据持久化,执行后生成 1-100 号完整数据,唯一字段依次递增不重复:
python
-- Oracle修正版:全新表插1-100号数据(匹配num_col字段)
DECLARE
v_start_id NUMBER := 1;
v_end_id NUMBER := 100;
v_base_phone NUMBER := 13581696799; -- 手机号起始值(+1后13581696800)
v_base_bank NUMBER := 6225881010845070;-- 银行卡起始值(+1后6225881010845071)
v_base_military NUMBER := 111208;-- 军号后缀起始值(+1后111209)
v_name VARCHAR2(20);
v_email VARCHAR2(50);
v_num_col NUMBER; -- 匹配新字段名
v_gender CHAR(1) := 'M';
v_id_card VARCHAR2(18);
v_phone VARCHAR2(11);
v_bank_card VARCHAR2(16);
v_military_no VARCHAR2(20);
v_address VARCHAR2(100);
-- 姓名/地址池
v_sur_list VARCHAR2(100) := '陈,李,胡,张,王,刘,赵,杨,周,黄';
v_name_suffix_list VARCHAR2(80) := '小欢,小冉,小可,小军,小芬,小玉,小琪,小宇';
v_addr_list VARCHAR2(600) := '北京市朝阳区立水桥北,北京市朝阳区立水桥北test,北京市朝阳区大屯北,北京市朝阳区国贸,北京市东城培新街,北京市海淀区中关村,北京市西城区金融街,北京市东城区王府井,北京市丰台区马家堡,北京市昌平区回龙观';
BEGIN
FOR i IN v_start_id .. v_end_id LOOP
-- 生成X小X姓名
v_name := REGEXP_SUBSTR(v_sur_list, '[^,]+', 1, TRUNC(DBMS_RANDOM.VALUE(1, 11)))
|| REGEXP_SUBSTR(v_name_suffix_list, '[^,]+', 1, TRUNC(DBMS_RANDOM.VALUE(1, 9)));
-- 生成邮箱
v_email := 'www' || TRUNC(DBMS_RANDOM.VALUE(1, 101)) || '@yahoo.com';
-- 生成随机数字
v_num_col := TRUNC(DBMS_RANDOM.VALUE(1, 101));
-- 生成身份证号
v_id_card := '46002519810910' || LPAD(TRUNC(DBMS_RANDOM.VALUE(1000, 9999)), 4, '0');
-- 唯一字段递增
v_base_phone := v_base_phone + 1;
v_phone := TO_CHAR(v_base_phone);
v_base_bank := v_base_bank + 1;
v_bank_card := TO_CHAR(v_base_bank);
v_base_military := v_base_military + 1;
v_military_no := '军字第' || LPAD(v_base_military, 8, '0') || '号';
-- 随机地址
v_address := REGEXP_SUBSTR(v_addr_list, '[^,]+', 1, TRUNC(DBMS_RANDOM.VALUE(1, 11)));
-- 按列序插入(匹配新表字段)
INSERT INTO users VALUES (
i, v_name, v_email, v_num_col, v_gender,
v_id_card, v_phone, v_bank_card, v_military_no, v_address
);
END LOOP;
COMMIT;
DBMS_OUTPUT.PUT_LINE('插入成功!共100条(1-100号)');
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('失败!错误:' || SQLCODE || ' - ' || SQLERRM);
END;
/
如果要插入10000条,改这里就可以
v_start_id NUMBER := 1;
v_end_id NUMBER := 10000; -- 原来 100 → 10000
3.3 Oracle 数据验证语句
执行建表和插入语句后,执行以下语句验证数据有效性(无报错、结果符合预期即成功):
bash
-- 1. 查看100条完整数据
SELECT * FROM users;
-- 2. 统计总数据量(正确结果:100)
SELECT COUNT(*) AS 总数据条数 FROM users;
-- 3. 验证唯一字段无重复(无结果返回即无重复)
SELECT phone, COUNT(*) FROM users GROUP BY phone HAVING COUNT(*) > 1;
SELECT bank_card, COUNT(*) FROM users GROUP BY bank_card HAVING COUNT(*) > 1;
SELECT military_no, COUNT(*) FROM users GROUP BY military_no HAVING COUNT(*) > 1;