SSB数据集导入postgresql

【学习需要,仅此记录,如有缺漏,敬请指正】

操作系统:Windows 11家庭版
提前安装好的软件:postgresql数据库、MSYS2(安装好之后,命令安装MinGW64并设置环境变量)、Navicat数据库管理工具、能运行c++程序的IDE工具

1、SSB数据集下载

(1)ssb-dbgen工具下载

https://github.com/electrum/ssb-dbgen
点击【code】,选择【Download ZIP】下载。下载后解压。
在这里插入图片描述

(2)ssb-dbgen编译

网上教程大多数是在linux上直接编译,或者是用visual studio进行编译,这里我直接在windows上采用MinGW64工具进行编译

打开MSYS MINGW64命令界面,进入到dbgen源码目录,输入make进行编译:
在这里插入图片描述
编译完成之后可能会报很多warning,但是生成了dbgen.exe文件,并不影响后续的使用。
在这里插入图片描述

(3)生成数据文件

参考博客:https://www.cnblogs.com/tgzhu/p/9083092.html

还是在MSYS2 MINGW64命令界面,进入到刚刚生成dbgen.exe的文件目录(如果没有移动,那这个文件就在dbgen源码目录下),输入以下命令,生成对应的数据文件:

./dbgen -s 1 -T c
./dbgen -s 1 -T p
./dbgen -s 1 -T s
./dbgen -s 1 -T d
./dbgen -s 1 -T l

一共5个表,规模参数是1,一般是最小量的数据。如果要一次性生成这个5个文件,可以使用以下命令:

./dbgen -s 1 -T a

2、导入postgresql数据库

(1)数据文件预处理

参考博客:https://www.cnblogs.com/yongzhewudi/p/5371396.html

因为dbgen.exe生成的.tbl文件,每一行最末尾都有一个“|”作为分隔符,这样的格式在导入过程中会出现错误,因此要做处理:将每一行最末尾的"|"换成换行符。

程序的代码如下(参考自以上博客),保存的时候记得后缀名是.cpp

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;

int main() { 
    string s;
    ifstream in;in.open("F:/ssb/dbgen/part.tbl");
    ofstream out;
    out.open("F:/ssb/data/part.tbl");  
    if (in.is_open()) {
        for ( ;getline(in, s);) {
            int len = s.length();
            int i = len - 1;
            if (s[i] == '|')
                s[i] = '\n';
            out << s;
        }
        out.close();
    }
}

第一个路径是你存放处理之前的.tbl文件的路径;
第二个路径是你处理之后的.tbl文件的存放路径。

(2)创建数据库和表模式

① 用数据库管理工具连接postgresql数据库,先创建一个新的数据库:

create database ssb;

② 使用该数据库,并在里面创建对应的表结构:

\c ssb;

--lineorder
CREATE TABLE lineorder (
  LO_ORDERKEY number, LO_LINENUMBER number, LO_CUSTKEY number,
  LO_PARTKEY number, LO_SUPPKEY number, LO_ORDERDATE number,
  LO_ORDERPRIORITY char(15),  LO_SHIPPRIORITY char(1), LO_QUANTITY number,
  LO_EXTENDEDPRICE number, LO_ORDTOTALPRICE number, LO_DISCOUNT number,
  LO_REVENUE number, LO_SUPPLYCOST number, LO_TAX number,
  LO_COMMITDATE number, LO_SHIPMODE char(10));

--supplier
CREATE TABLE supplier (
  S_SUPPKEY number, S_NAME char(25), S_ADDRESS varchar(25), S_CITY char(10),
  S_NATION char(15), S_REGION char(12), S_PHONE char(15));

--part
CREATE TABLE part (
 P_PARTKEY number, P_NAME varchar(22), P_MFGR char(6), P_CATEGORY char(7),
 P_BRAND1 char(9), P_COLOR varchar(11), P_TYPE varchar(25), P_SIZE number,
 P_CONTAINER char(10));

--customer
CREATE TABLE customer (
  C_CUSTKEY number, C_NAME varchar(25), C_ADDRESS varchar(25),
  C_CITY char(10), C_NATION char(15), C_REGION char(12), C_PHONE char(15),
  C_MKTSEGMENT char(10)) ;

--dates
CREATE TABLE dates (
 D_DATEKEY number, D_DATE char(18), D_DAYOFWEEK char(10), D_MONTH char(9),
 D_YEAR number, D_YEARMONTHNUM number, D_YEARMONTH char(7),
 D_DAYNUMINWEEK number, D_DAYNUMINMONTH number, D_DAYNUMINYEAR number,
 D_MONTHNUMINYEAR number, D_WEEKNUMINYEAR number, D_SELLINGSEASON char(12),
 D_LASTDAYINWEEKFL char(1), D_LASTDAYINMONTHFL char(1), D_HOLIDAYFL char(1),
 D_WEEKDAYFL char(1)) ;

(3)导入数据

参考博客:https://www.cnblogs.com/yongzhewudi/p/5371396.html

用数据库管理工具执行以下命令:

copy customer from 'F:\ssb\data\customer.tbl' DELIMITER '|';
copy supplier from 'F:\ssb\data\supplier.tbl' DELIMITER '|';
copy part from 'F:\ssb\data\part.tbl' DELIMITER '|';
copy lineorder from 'F:\ssb\data\lineorder.tbl' DELIMITER '|';
copy dates from 'F:\ssb\data\date.tbl' DELIMITER '|';

【注】:注意表名和数据库中已创建的表名一致;数据文件名称和你存放的处理之后的数据文件名称一致!

导入之后,为了使数据之间的约束更加完整,可以参考网上的教程添加主外键约束。

导入成功之后,就可以使用SQL语句进行操作了。

【学习需要,仅此记录,如有缺漏,敬请指正】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值