TPC-H生成.tbl文件导入postgresql数据库的坑

数据库project好好的不用主流的MySQL和Microsoft server而要求用听都没听过的postgresql (当然,可能你三个都没听过)

这里的坑主要是把生成的那八张.tbl的表导入pgAdmin中,而网上搜到的有关的资料大部分都是针对Linux的,而没有顾及我们用Windows的宝宝的苦啊/(ㄒoㄒ)/~

下面是超级详细的过程

首先是postgresql数据库的下载

官网: http://www.postgresql.org/

点击Download

 

 

点击windows(这里只针对Windows系统) 前面的BSD就不要手贱点进去了

 

再点击’download‘ (其实这个步骤应该不用讲的。。。)

 

然后如果遇到弹出的注册窗口就直接×掉,然后选择对应的Windows 64位版本

再然后呢,这里直接点here就行了,如果等的话估计要天荒地老

 

 

 

安装过程中一直默认就行了,过程中会出现要设置密码的两个窗口(建议123456,不要作死设置太复杂,如果记性特别好的话当我没说)

 

 

 

还有最后一步时中间有个默认打勾的设置,把那个勾给点击取消掉(里面的附加插件不需要用的)

 

终于安装完了(松一口气中...),咦,桌面图标呢?postgresql安装完后默认是桌面没有快捷方式的,要在你的"所有程序"中找

 

右键找到文件所在位置后再右键把图标快捷方式发送到桌面

 

接着就是TPC-H的下载啦 (Ps:文末有福利,可以开挂跳过一大段过程)

最新地址如下

http://www.tpc.org/tpc_documents_current_versions/current_specifications.asp 

(课程助教发的链接是失效的我会说出来么)

进入页面后是选择红色圈圈TPC-H对应的zip压缩包下载,网页会跳转到一个注册页面,除了邮箱要填个能用的,其他的随便填点什么就行,然后登录你填的邮箱去点击激活,然后浏览器这边就会开始下载了

下载后解压(建议解压到 C:\Program Files\PostgreSQL\9.5\ 目录下),打开目录一直到dbgen下,再找到那个tpch.sln文件(如果你没有装visual stdio的话就要停下来安装了,我的是2015的免费的社区版,亲测四个小时,期间可以撸几盘或者睡个觉)

 

用visual stdio 打开后点击‘生成’ 里的‘生成degen',然后就会看到刚才目录下多了个dbgen.exe

 

 

这里有点要注意的:

要将生成的dbgen.exe 从Dbgen文件夹下复制到上一层的dbgen文件夹下,别忘了哦

 

然后打开,但注意不是直接双击degen.exe,而是win+r后输入cmd调出终端命令行来打开

然后cd 到dbgen文件夹目录下,然后输入 dbgen -vf -s 1    (这个1是生成1G容量数据的意思)

如果出现下面情况错误情况的原因是目录错了,去到dbgen目录下就行(因为前面已经把Dbgen的dbgen.exe复制到dbgen文件夹下了)

 

如果还是不行的话可以用管理员身份重新运行试一下
如果运行正常的话,是酱紫的~
 

 

然后又开始了漫长的等待。。。

成功后目录下就会又多出八个.tbl后缀名的文件,里面储存的就是我们要的数据啦

咳咳,现在到了最重要的一步,曾经百度好搜谷歌搜狐维基换了无数搜索引擎和修改无数次搜索关键字,毛都没有!即使有接近的资料,都找不到一个完全准确的导入方法,下面是踩了无数坑后的吐血经验分享

#include<iostream>  //如果显示错误说打不开找不到文件,可能是路径识别出错,把那几个tbl文件放到visual stdio的该程序运行的.cpp的目录下再运行,如果是用DEV C++的话,就把这个代码的源.cpp另存到C:/Program Files\PostgreSQL\9.5\TCP-dbgen\tpch_2_17_0\dbgen目录下再运行,把路径改为‘customer.tbl'就行
#include<fstream>
#include<string>
#include<vector>
using namespace std;

int main() {      //这段C++文件读写的作用就是把.tbl文件中每一行最后的那个'|'符号给去掉,这样才能导入
    string s;
    ifstream in;in.open("C:/Program Files\PostgreSQL\9.5\tpch-dbgen\tpch_2_17_0\dbgen\customer.tbl");
    ofstream out;
    out.open("C:/Program Files\PostgreSQL\9.5\tpch-dbgen\tpch_2_17_0\dbgen\customer1.tbl");  //这个导出的名字为了方便记忆,只是在原本名字后面加个1
    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();
    }
}

 

然后把八个文件都进行这样的转换操作后,就会得到八个新的文件啦

现在可以打开你安装好的的pgAdmin III 了,就是这个萌萌哒大象

然后对下面的本地服务器这个右键选择连接

这里插一句,如果连接失败,可以到输入框输入“服务”,然后选择这个最佳匹配的服务应用

然后找到postgresql右键启动,然后再重新在pgAdmin连接,如果这样报错或者还是连不上,那就卸载重装或者确认一下自己有没记错一开始安装时设置的密码,如果这样还是不行,那就,那就去百度吧,摸摸头,我也帮不了你了

连接服务器成功的来到默认服务器postgresql下点击SQL查询图标,没连接成功的弃疗的就算了

然后创建对应的八张表和导入表的copy操作还有添加主键,外键,这段直接复制粘贴行了,没什么技术含量的,提醒一下要有耐心,估计没有耐心的小盆友也来不到这一步就怒砸电脑了。。。

 
CREATE TABLE NATION  ( N_NATIONKEY  INTEGER NOT NULL,
                            N_NAME       CHAR(25) NOT NULL,
                            N_REGIONKEY  INTEGER NOT NULL,
                            N_COMMENT    VARCHAR(152));

CREATE TABLE REGION  ( R_REGIONKEY  INTEGER NOT NULL,
                            R_NAME       CHAR(25) NOT NULL,
                            R_COMMENT    VARCHAR(152));

CREATE TABLE PART  ( P_PARTKEY     INTEGER NOT NULL,
                          P_NAME        VARCHAR(55) NOT NULL,
                          P_MFGR        CHAR(25) NOT NULL,
                          P_BRAND       CHAR(10) NOT NULL,
                          P_TYPE        VARCHAR(25) NOT NULL,
                          P_SIZE        INTEGER NOT NULL,
                          P_CONTAINER   CHAR(10) NOT NULL,
                          P_RETAILPRICE DECIMAL(15,2) NOT NULL,
                          P_COMMENT     VARCHAR(23) NOT NULL );

CREATE TABLE SUPPLIER ( S_SUPPKEY     INTEGER NOT NULL,
                             S_NAME        CHAR(25) NOT NULL,
                             S_ADDRESS     VARCHAR(40) NOT NULL,
                             S_NATIONKEY   INTEGER NOT NULL,
                             S_PHONE       CHAR(15) NOT NULL,
                             S_ACCTBAL     DECIMAL(15,2) NOT NULL,
                             S_COMMENT     VARCHAR(101) NOT NULL);

CREATE TABLE PARTSUPP ( PS_PARTKEY     INTEGER NOT NULL,
                             PS_SUPPKEY     INTEGER NOT NULL,
                             PS_AVAILQTY    INTEGER NOT NULL,
                             PS_SUPPLYCOST  DECIMAL(15,2)  NOT NULL,
                             PS_COMMENT     VARCHAR(199) NOT NULL );

CREATE TABLE CUSTOMER ( C_CUSTKEY     INTEGER NOT NULL,
                             C_NAME        VARCHAR(25) NOT NULL,
                             C_ADDRESS     VARCHAR(40) NOT NULL,
                             C_NATIONKEY   INTEGER NOT NULL,
                             C_PHONE       CHAR(15) NOT NULL,
                             C_ACCTBAL     DECIMAL(15,2)   NOT NULL,
                             C_MKTSEGMENT  CHAR(10) NOT NULL,
                             C_COMMENT     VARCHAR(117) NOT NULL);

CREATE TABLE ORDERS  ( O_ORDERKEY       INTEGER NOT NULL,
                           O_CUSTKEY        INTEGER NOT NULL,
                           O_ORDERSTATUS    CHAR(1) NOT NULL,
                           O_TOTALPRICE     DECIMAL(15,2) NOT NULL,
                           O_ORDERDATE      DATE NOT NULL,
                           O_ORDERPRIORITY  CHAR(15) NOT NULL,  
                           O_CLERK          CHAR(15) NOT NULL, 
                           O_SHIPPRIORITY   INTEGER NOT NULL,
                           O_COMMENT        VARCHAR(79) NOT NULL);

CREATE TABLE LINEITEM ( L_ORDERKEY    INTEGER NOT NULL,
                             L_PARTKEY     INTEGER NOT NULL,
                             L_SUPPKEY     INTEGER NOT NULL,
                             L_LINENUMBER  INTEGER NOT NULL,
                             L_QUANTITY    DECIMAL(15,2) NOT NULL,
                             L_EXTENDEDPRICE  DECIMAL(15,2) NOT NULL,
                             L_DISCOUNT    DECIMAL(15,2) NOT NULL,
                             L_TAX         DECIMAL(15,2) NOT NULL,
                             L_RETURNFLAG  CHAR(1) NOT NULL,
                             L_LINESTATUS  CHAR(1) NOT NULL,
                             L_SHIPDATE    DATE NOT NULL,
                             L_COMMITDATE  DATE NOT NULL,
                             L_RECEIPTDATE DATE NOT NULL,
                             L_SHIPINSTRUCT CHAR(25) NOT NULL,
                             L_SHIPMODE     CHAR(10) NOT NULL,
                             L_COMMENT      VARCHAR(44) NOT NULL);

copy CUSTOMER from 'C:\Program Files\PostgreSQL\9.5\dbgen\customer1.tbl' DELIMITER '|';
copy SUPPLIER from 'C:\Program Files\PostgreSQL\9.5\dbgen\supplier1.tbl' DELIMITER '|';
copy NATION from 'C:\Program Files\PostgreSQL\9.5\dbgen\nation1.tbl' DELIMITER '|';
copy REGION from 'C:\Program Files\PostgreSQL\9.5\dbgen\region1.tbl' DELIMITER '|';
copy PART from 'C:\Program Files\PostgreSQL\9.5\dbgen\part1.tbl' DELIMITER '|';
copy PARTSUPP from 'C:\Program Files\PostgreSQL\9.5\dbgen\partsupp1.tbl' DELIMITER '|';  
copy ORDERS from 'C:\Program Files\PostgreSQL\9.5\dbgen\orders1.tbl' DELIMITER '|'; 
copy LINEITEM from 'C:\Program Files\PostgreSQL\9.5\dbgen\lineitem1.tbl' DELIMITER '|'; --六百多万行,导入用了七八分钟,还以为程序崩了

-- For table REGION
ALTER TABLE REGION
ADD PRIMARY KEY (R_REGIONKEY);

-- For table NATION
ALTER TABLE NATION
ADD PRIMARY KEY (N_NATIONKEY);

ALTER TABLE NATION
ADD FOREIGN KEY (N_REGIONKEY) references REGION;

COMMIT WORK;

-- For table PART
ALTER TABLE PART
ADD PRIMARY KEY (P_PARTKEY);

COMMIT WORK;

-- For table SUPPLIER
ALTER TABLE SUPPLIER
ADD PRIMARY KEY (S_SUPPKEY);

ALTER TABLE SUPPLIER
ADD FOREIGN KEY (S_NATIONKEY) references NATION;

COMMIT WORK;

-- For table PARTSUPP
ALTER TABLE PARTSUPP
ADD PRIMARY KEY (PS_PARTKEY,PS_SUPPKEY);

COMMIT WORK;

-- For table CUSTOMER
ALTER TABLE CUSTOMER
ADD PRIMARY KEY (C_CUSTKEY);

ALTER TABLE CUSTOMER
ADD FOREIGN KEY (C_NATIONKEY) references NATION;

COMMIT WORK;

-- For table LINEITEM
ALTER TABLE LINEITEM
ADD PRIMARY KEY (L_ORDERKEY,L_LINENUMBER);

COMMIT WORK;

-- For table ORDERS
ALTER TABLE ORDERS
ADD PRIMARY KEY (O_ORDERKEY);

COMMIT WORK;

-- For table PARTSUPP
ALTER TABLE PARTSUPP
ADD FOREIGN KEY (PS_SUPPKEY) references SUPPLIER;

COMMIT WORK;

ALTER TABLE PARTSUPP
ADD FOREIGN KEY (PS_PARTKEY) references PART;

COMMIT WORK;

-- For table ORDERS
ALTER TABLE ORDERS
ADD FOREIGN KEY (O_CUSTKEY) references CUSTOMER;

COMMIT WORK;

-- For table LINEITEM
ALTER TABLE LINEITEM
ADD FOREIGN KEY (L_ORDERKEY)  references ORDERS;

COMMIT WORK;

ALTER TABLE LINEITEM
ADD FOREIGN KEY (L_PARTKEY,L_SUPPKEY) references PARTSUPP;

COMMIT WORK;


 


然后,就可以操作查询什么的啦O(∩_∩)O~~
对了,查询窗口下要用鼠标选中,然后点击执行查询的话才执行选中的那个语句的,例如下面的select nation.n_name from nation;
那个copy的导入语句和设置主键外键时建议一句一句选中执行,多选语句的话好像只执行最后一行



最后附上八张表的关系图 (右键另存为桌面文件方便做题参考)


文末福利: 我已经转换好格式的.tbl文件已上传,那就不用这么辛苦特地浪费时间下viusal stdio 2015可以跳过一大堆复杂的流程直接到‘打开你安装好的的pgAdmin III了’这一步了(此处应有掌声和点赞)
http://pan.baidu.com/s/1kVq4HDX
还有顺便介绍一个不用特地下载百度云管家更快速下载方法:
1.使用360安全浏览器,360极速浏览器,百度,搜狗等的极速模式(高速模式),在百度云盘下载地址前添加"https://" 按Enter键回车访问即可

2,然后再点击【下载】按钮就会发现可以直接打开迅雷下载大文件了。
 

 

posted @ 2016-04-09 12:46  YongJun0515  阅读(2845)  评论(12编辑  收藏  举报