用户信息表建表及批量插入 100 条数据(MySQL/Oracle)

用户信息表建表及批量插入 100 条数据(MySQL/Oracle)

本文档提供MySQLOracle 数据库下,用户信息表(users)的新建表语句批量插入 100 条模拟数据语句,数据格式匹配预设的用户信息规范(含编号、姓名、邮箱、手机号、银行卡等 10 个字段),语句可直接复制执行,适配主流数据库客户端(MySQL Workbench/Navicat、PL/SQL Developer/Oracle SQL*Plus)。

一、核心数据规范

  1. 表名:users,共 10 个字段,字段列序固定(不可调整);
  2. 数据量:批量插入后总数据量为 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;
相关推荐
jiayou641 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
于眠牧北1 天前
MySQL的锁类型,表锁,行锁,MVCC中所使用的临键锁
mysql
李广坤2 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
Turnip12023 天前
深度解析:为什么简单的数据库"写操作"会在 MySQL 中卡住?
后端·mysql
爱可生开源社区3 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1773 天前
《从零搭建NestJS项目》
数据库·typescript
加号34 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏4 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐4 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再4 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip