TPC-H测试(Oracle、MySQL、PostgreSQL)

一、Linux下使用DBGEN 和QGEN 程序创建数据与查询脚本

1、下载工具压缩包
http://www.tpc.org/tpc_documents_current_versions/current_specifications.asp

《TPC-H测试(Oracle、MySQL、PostgreSQL)》 image.png

2、将压缩包放置到指定目录下,解压压缩包

unzip tpc-h-tool.zip

3、修改makefile文件内容
–在CC后填写gcc
–在DATABASE后填写Oracle
–在MACHINE后填写LINUX
–在WORKLOAD后填写TPCH

################
## CHANGE NAME OF ANSI COMPILER HERE
################
CC      = gcc
# Current values for DATABASE are: INFORMIX, DB2, TDAT (Teradata)
#                                  SQLSERVER, SYBASE, ORACLE, VECTORWISE
# Current values for MACHINE are:  ATT, DOS, HP, IBM, ICL, MVS, 
#                                  SGI, SUN, U2200, VMS, LINUX, WIN32 
# Current values for WORKLOAD are:  TPCH
DATABASE=ORACLE     
MACHINE = LINUX         
WORKLOAD = TPCH     

4、执行编译

make

5、执行数据生成操作
— -s后填写的是SF的数量,TPC- H 中使用SF 描述数据量,1SF 对应1 GB 单位,SF 由低到高依次是1、10、30、100、300、1 000、3 000、10 000。
— time是输出产生数据的时间,可以忽略直接写为./dbgen -s 1 -vf

time ./dbgen -s 1 -vf

6、生成查询测试脚本
将默认脚本克隆到qgen程序的同级目录,执行./qgen,-s后填写的是SF的数量,不同的SF生成查询sql中的参数值会有所不同。使用DATABASE=ORACLE 编译的程序生成脚本只需改动一点即可通用于所需测试的三个数据库,因此不建议多次编译用于生成对应数据库脚本(试过在不同目录下解压编译,因创建查询脚本时使用的seed值不一样,相同的SF值生成脚本参数不一致)。

[root@dn210120 dbgen]# cp ./queries/*.sql ./
[root@dn210120 dbgen]# ./qgen -s 1 > query.sql

二、Oracle导入数据与脚本处理

1、Oracle建表脚本

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

CREATE TABLE NATION (
    N_NATIONKEY     INT NOT NULL,
    N_NAME          CHAR(25),
    N_REGIONKEY     INTEGER NOT NULL,  -- references R_REGIONKEY
    N_COMMENT       VARCHAR2(152)
);

CREATE TABLE SUPPLIER (
    S_SUPPKEY       INT NOT NULL,
    S_NAME          CHAR(25),
    S_ADDRESS       VARCHAR2(40),
    S_NATIONKEY     INTEGER NOT NULL, -- references N_NATIONKEY
    S_PHONE         CHAR(15),
    S_ACCTBAL       DECIMAL,
    S_COMMENT       VARCHAR2(101)
);

CREATE TABLE PARTSUPP (
    PS_PARTKEY      INTEGER NOT NULL, -- references P_PARTKEY
    PS_SUPPKEY      INTEGER NOT NULL, -- references S_SUPPKEY
    PS_AVAILQTY     INTEGER,
    PS_SUPPLYCOST   DECIMAL,
    PS_COMMENT      VARCHAR2(199)
);

CREATE TABLE CUSTOMER (
    C_CUSTKEY       INT NOT NULL,
    C_NAME          VARCHAR2(25),
    C_ADDRESS       VARCHAR2(40),
    C_NATIONKEY     INTEGER NOT NULL, -- references N_NATIONKEY
    C_PHONE         CHAR(15),
    C_ACCTBAL       DECIMAL,
    C_MKTSEGMENT    CHAR(10),
    C_COMMENT       VARCHAR2(117)
);

CREATE TABLE ORDERS (
    O_ORDERKEY      INT NOT NULL,
    O_CUSTKEY       INTEGER NOT NULL, -- references C_CUSTKEY
    O_ORDERSTATUS   CHAR(1),
    O_TOTALPRICE    DECIMAL,
    O_ORDERDATE     DATE,
    O_ORDERPRIORITY CHAR(15),
    O_CLERK         CHAR(15),
    O_SHIPPRIORITY  INTEGER,
    O_COMMENT       VARCHAR2(79)
);

CREATE TABLE LINEITEM (
    L_ORDERKEY      INTEGER NOT NULL, -- references O_ORDERKEY
    L_PARTKEY       INTEGER NOT NULL, -- references P_PARTKEY (compound fk to PARTSUPP)
    L_SUPPKEY       INTEGER NOT NULL, -- references S_SUPPKEY (compound fk to PARTSUPP)
    L_LINENUMBER    INTEGER NOT NULL,
    L_QUANTITY      DECIMAL,
    L_EXTENDEDPRICE DECIMAL,
    L_DISCOUNT      DECIMAL,
    L_TAX           DECIMAL,
    L_RETURNFLAG    CHAR(3),
    L_LINESTATUS    CHAR(3),
    L_SHIPDATE      DATE,
    L_COMMITDATE    DATE,
    L_RECEIPTDATE   DATE,
    L_SHIPINSTRUCT  CHAR(25),
    L_SHIPMODE      CHAR(10),
    L_COMMENT       VARCHAR2(44)
);

CREATE TABLE REGION (
    R_REGIONKEY INT NOT NULL,
    R_NAME      CHAR(25),
    R_COMMENT   VARCHAR2(152)
);

2、Oracle导入数据语句
使用sqlldr执行ctl文件进行数据导入,一个LOAD DATA语句一个ctl文件。LOAD DATA语句可参考一下sql。

LOAD DATA INFILE '/data/temp/part.tbl'   INTO TABLE part TRAILING NULLCOLS(
    P_PARTKEY       terminated by '|',
    P_NAME          terminated by '|',
    P_MFGR          terminated by '|',
    P_BRAND         terminated by '|',
    P_TYPE          terminated by '|',
    P_SIZE          terminated by '|',
    P_CONTAINER     terminated by '|',
    P_RETAILPRICE   terminated by '|',
    P_COMMENT       terminated by '|'
)

LOAD DATA INFILE '/data/temp/nation.tbl'   INTO TABLE nation TRAILING NULLCOLS(
    N_NATIONKEY     terminated by '|',
    N_NAME          terminated by '|',
    N_REGIONKEY     terminated by '|',
    N_COMMENT       terminated by '|'
)                


LOAD DATA INFILE '/data/temp/supplier .tbl'   INTO TABLE supplier TRAILING NULLCOLS  (
    S_SUPPKEY       terminated by '|',
    S_NAME          terminated by '|',
    S_ADDRESS       terminated by '|',
    S_NATIONKEY     terminated by '|',
    S_PHONE         terminated by '|',
    S_ACCTBAL       terminated by '|',
    S_COMMENT       terminated by '|'
)

LOAD DATA INFILE '/data/temp/partsupp.tbl'   INTO TABLE partsupp  TRAILING NULLCOLS(
    PS_PARTKEY      terminated by '|',
    PS_SUPPKEY      terminated by '|',
    PS_AVAILQTY     terminated by '|',
    PS_SUPPLYCOST   terminated by '|',
    PS_COMMENT      terminated by '|'
)

LOAD DATA INFILE '/data/temp/customer.tbl'   INTO TABLE customer TRAILING NULLCOLS (
    C_CUSTKEY       terminated by '|',
    C_NAME          terminated by '|',
    C_ADDRESS       terminated by '|',
    C_NATIONKEY     terminated by '|',
    C_PHONE         terminated by '|',
    C_ACCTBAL       terminated by '|',
    C_MKTSEGMENT    terminated by '|',
    C_COMMENT       terminated by '|'
)

LOAD DATA INFILE '/data/temp/orders.tbl'   INTO TABLE orders fields terminated by "|" TRAILING NULLCOLS (
    O_ORDERKEY      terminated by '|',
    O_CUSTKEY       terminated by '|',
    O_ORDERSTATUS   terminated by '|',
    O_TOTALPRICE    terminated by '|',
    O_ORDERDATE     DATE "YYYY-MM-DD",
    O_ORDERPRIORITY terminated by '|',
    O_CLERK         terminated by '|',
    O_SHIPPRIORITY  terminated by '|',
    O_COMMENT       terminated by '|'
)

LOAD DATA INFILE '/data/temp/lineitem.tbl'   INTO TABLE lineitem  fields terminated by "|" TRAILING NULLCOLS(
        L_ORDERKEY              terminated by "|" ,
        L_PARTKEY               terminated by "|",
        L_SUPPKEY               terminated by "|",
        L_LINENUMBER    terminated by "|",
        L_QUANTITY              terminated by "|",
        L_EXTENDEDPRICE terminated by "|",
        L_DISCOUNT              terminated by "|",
        L_TAX                   terminated by "|",
        L_RETURNFLAG    CHAR(3) ,
        L_LINESTATUS    CHAR(3) ,
        L_SHIPDATE              DATE "YYYY-MM-DD" ,
        L_COMMITDATE    DATE "YYYY-MM-DD" ,
        L_RECEIPTDATE   DATE "YYYY-MM-DD" ,
        L_SHIPINSTRUCT  CHAR(25) ,
        L_SHIPMODE              CHAR(10) ,
        L_COMMENT               CHAR(44)
)


LOAD DATA INFILE '/data/temp/region.tbl'   INTO TABLE region  (
    R_REGIONKEY terminated by '|',
    R_NAME      terminated by '|',
    R_COMMENT   terminated by '|'
)

执行sqlldr将数据导入到数据库中,执行sqlldr userid=user/password@database control=ctl文件的绝对路径 log=/data/temp/load_tpch.log

sqlldr userid=tpch10g/test@utf8db control=/data/temp/load_tpch_part.ctl rows=10000 bindsize=20971520 direct=true  log=/data/temp/part.log
sqlldr userid=tpch10g/test@utf8db control=/data/temp/load_tpch_customer.ctl rows=10000 bindsize=20971520 direct=true  log=/data/temp/customer.log
sqlldr userid=tpch10g/test@utf8db control=/data/temp/load_tpch_lineitem.ctl rows=10000 bindsize=20971520 direct=true  log=/data/temp/lineitem.log
sqlldr userid=tpch10g/test@utf8db control=/data/temp/load_tpch_nation.ctl rows=10000 bindsize=20971520 direct=true  log=/data/temp/nation.log
sqlldr userid=tpch10g/test@utf8db control=/data/temp/load_tpch_orders.ctl rows=10000 bindsize=20971520 direct=true  log=/data/temp/orders.log
sqlldr userid=tpch10g/test@utf8db control=/data/temp/load_tpch_partsupp.ctl rows=10000 bindsize=20971520 direct=true  log=/data/temp/partsupp.log
sqlldr userid=tpch10g/test@utf8db control=/data/temp/load_tpch_region.ctl rows=10000 bindsize=20971520 direct=true  log=/data/temp/region.log
sqlldr userid=tpch10g/test@utf8db control=/data/temp/load_tpch_supplier.ctl rows=10000 bindsize=20971520 direct=true  log=/data/temp/supplier.log

3、Oracle创建主外键语句

-- PRIMARY KEY
ALTER TABLE PART ADD PRIMARY KEY (P_PARTKEY);
ALTER TABLE SUPPLIER ADD PRIMARY KEY (S_SUPPKEY);
ALTER TABLE PARTSUPP ADD PRIMARY KEY (PS_PARTKEY, PS_SUPPKEY);
ALTER TABLE CUSTOMER ADD PRIMARY KEY (C_CUSTKEY);
ALTER TABLE ORDERS ADD PRIMARY KEY (O_ORDERKEY);
ALTER TABLE LINEITEM ADD PRIMARY KEY (L_ORDERKEY, L_LINENUMBER);
ALTER TABLE NATION ADD PRIMARY KEY (N_NATIONKEY);
ALTER TABLE REGION ADD PRIMARY KEY (R_REGIONKEY);

-- FOREIGN KEY
ALTER TABLE SUPPLIER ADD CONSTRAINT fk_tpcc_1 FOREIGN KEY (S_NATIONKEY) REFERENCES NATION(N_NATIONKEY);
ALTER TABLE PARTSUPP ADD CONSTRAINT fk_tpcc_2 FOREIGN KEY (PS_PARTKEY) REFERENCES PART(P_PARTKEY);
ALTER TABLE PARTSUPP ADD CONSTRAINT fk_tpcc_3 FOREIGN KEY (PS_SUPPKEY) REFERENCES SUPPLIER(S_SUPPKEY);
ALTER TABLE CUSTOMER ADD CONSTRAINT fk_tpcc_4 FOREIGN KEY (C_NATIONKEY) REFERENCES NATION(N_NATIONKEY);
ALTER TABLE ORDERS   ADD CONSTRAINT fk_tpcc_5 FOREIGN KEY   (O_CUSTKEY) REFERENCES CUSTOMER(C_CUSTKEY);
ALTER TABLE LINEITEM ADD CONSTRAINT fk_tpcc_6 FOREIGN KEY (L_ORDERKEY) REFERENCES ORDERS(O_ORDERKEY);
ALTER TABLE LINEITEM ADD CONSTRAINT fk_tpcc_7 FOREIGN KEY (L_PARTKEY,L_SUPPKEY) REFERENCES PARTSUPP(PS_PARTKEY,PS_SUPPKEY);
ALTER TABLE NATION   ADD CONSTRAINT fk_tpcc_8 FOREIGN KEY   (N_REGIONKEY) REFERENCES REGION(R_REGIONKEY);

三、MySQL导入数据与脚本处理

1、MySQL建表脚本

create table part  ( 
    p_partkey     integer not null,
        p_name        varchar(55) ,
        p_mfgr        char(25) ,
        p_brand       char(10) ,
        p_type        varchar(25) ,
        p_size        integer ,
        p_container   char(10) ,
        p_retailprice decimal(15,2) ,
        p_comment     varchar(23)  );


create table nation  ( 
    n_nationkey  integer not null,
        n_name       char(25) ,
        n_regionkey  integer not null,
        n_comment    varchar(152));

create table region  ( 
    r_regionkey  integer not null,
        r_name       char(25) ,
        r_comment    varchar(152));

create table supplier ( 
    s_suppkey     integer not null,
        s_name        char(25) ,
        s_address     varchar(40) ,
        s_nationkey   integer not null,
        s_phone       char(15) ,
        s_acctbal     decimal(15,2) ,
        s_comment     varchar(101) );

create table partsupp ( 
        ps_partkey     integer not null,
        ps_suppkey     integer not null,
        ps_availqty    integer ,
        ps_supplycost  decimal(15,2)  ,
        ps_comment     varchar(199)  );

create table customer ( 
    c_custkey     integer not null,
        c_name        varchar(25) ,
        c_address     varchar(40) ,
        c_nationkey   integer not null,
        c_phone       char(15) ,
        c_acctbal     decimal(15,2)   ,
        c_mktsegment  char(10) ,
        c_comment     varchar(117) );

create table orders  (
    o_orderkey       integer not null,
        o_custkey        integer not null,
        o_orderstatus    char(1) ,
        o_totalprice     decimal(15,2) ,
        o_orderdate      date ,
        o_orderpriority  char(15) ,  
        o_clerk          char(15) , 
        o_shippriority   integer ,
        o_comment        varchar(79) );

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) ,
        l_extendedprice  decimal(15,2) ,
        l_discount    decimal(15,2) ,
        l_tax         decimal(15,2) ,
        l_returnflag  char(1) ,
        l_linestatus  char(1) ,
        l_shipdate    date ,
        l_commitdate  date ,
        l_receiptdate date ,
        l_shipinstruct char(25) ,
        l_shipmode     char(10) ,
        l_comment      varchar(44) );

2、MySQL导入数据语句

load data local infile '/data/tpch/tpch/data/10g/customer.tbl' into table customer fields terminated by '|';
load data local infile '/data/tpch/tpch/data/10g/lineitem.tbl' into table lineitem fields terminated by '|';
load data local infile '/data/tpch/tpch/data/10g/nation.tbl' into table nation fields terminated by '|';
load data local infile '/data/tpch/tpch/data/10g/orders.tbl' into table orders fields terminated by '|';
load data local infile '/data/tpch/tpch/data/10g/partsupp.tbl' into table partsupp fields terminated by '|';
load data local infile '/data/tpch/tpch/data/10g/part.tbl' into table part fields terminated by '|';
load data local infile '/data/tpch/tpch/data/10g/region.tbl' into table region fields terminated by '|';
load data local infile '/data/tpch/tpch/data/10g/supplier.tbl' into table supplier fields terminated by '|';

3、MySQL创建主外键语句

alter table part add primary key (p_partkey);
alter table supplier add primary key (s_suppkey);
alter table partsupp add primary key (ps_partkey, ps_suppkey);
alter table customer add primary key (c_custkey);
alter table orders add primary key (o_orderkey);
alter table lineitem add primary key (l_orderkey, l_linenumber);
alter table nation add primary key (n_nationkey);
alter table region add primary key (r_regionkey);

alter table supplier add constraint fk_tpcc_1 foreign key(s_nationkey) references nation(n_nationkey);
alter table partsupp add constraint fk_tpcc_2 foreign key(ps_partkey) references part(p_partkey);
alter table partsupp add constraint fk_tpcc_3 foreign key(ps_suppkey) references supplier(s_suppkey);
alter table customer add constraint fk_tpcc_4 foreign key(c_nationkey) references nation(n_nationkey);
alter table orders   add constraint fk_tpcc_5 foreign key(o_custkey) references customer(c_custkey);
alter table lineitem add constraint fk_tpcc_6 foreign key(l_orderkey) references orders(o_orderkey);
alter table lineitem add constraint fk_tpcc_7 foreign key(l_partkey,l_suppkey) references partsupp(ps_partkey,ps_suppkey);
alter table nation   add constraint fk_tpcc_8 foreign key(n_regionkey) references region(r_regionkey);

四、PostgreSQL导入数据与脚本处理

1、PostgreSQL建表脚本

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




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


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

CREATE TABLE PARTSUPP (
PS_PARTKEY   INTEGER NOT NULL, -- references P_PARTKEY
PS_SUPPKEY   INTEGER NOT NULL, -- references S_SUPPKEY
PS_AVAILQTY    INTEGER,
PS_SUPPLYCOST   DECIMAL,
PS_COMMENT  VARCHAR(199)
);

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

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

CREATE TABLE LINEITEM (
L_ORDERKEY     INTEGER NOT NULL, -- references O_ORDERKEY
L_PARTKEY    INTEGER NOT NULL, -- references P_PARTKEY (compound fk to PARTSUPP)
L_SUPPKEY    INTEGER NOT NULL, -- references S_SUPPKEY (compound fk to PARTSUPP)
L_LINENUMBER   INTEGER NOT NULL,
L_QUANTITY    DECIMAL,
L_EXTENDEDPRICE    DECIMAL,
L_DISCOUNT   DECIMAL,
L_TAX     DECIMAL,
L_RETURNFLAG    CHAR(1),
L_LINESTATUS    CHAR(1),
L_SHIPDATE    DATE,
L_COMMITDATE    DATE,
L_RECEIPTDATE    DATE,
L_SHIPINSTRUCT   CHAR(25),
L_SHIPMODE   CHAR(10),
L_COMMENT   VARCHAR(44)
);

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

2、PostgreSQL导入数据语句
PostgreSQL导入数据前需要先将dbgen生成的数据中每一行最后一个“|”分隔符去除,否则无法正常导入,批量“|”去除的方式可以参考以下脚本。

--将tbl文件转换为csv,在liunx下,进入tbl所在文件夹执行以下命令即可
for i in `ls *.tbl`; do sed 's/|$//' $i > ${i/tbl/csv}; done

数据导入使用COPY命令

COPY customer(C_CUSTKEY,C_NAME,C_ADDRESS,C_NATIONKEY,C_PHONE,C_ACCTBAL,C_MKTSEGMENT,C_COMMENT) FROM '/data/tpch/tpch/data/10g/customer.csv' delimiter '|' ;
COPY lineitem(L_ORDERKEY,L_PARTKEY,L_SUPPKEY,L_LINENUMBER,L_QUANTITY,L_EXTENDEDPRICE,L_DISCOUNT,L_TAX,L_RETURNFLAG,L_LINESTATUS,L_SHIPDATE,L_COMMITDATE,L_RECEIPTDATE,L_SHIPINSTRUCT,L_SHIPMODE,L_COMMENT) FROM '/data/tpch/tpch/data/10g/lineitem.csv' delimiter '|' ;
COPY nation(N_NATIONKEY,N_NAME,N_REGIONKEY,N_COMMENT) FROM   '/data/tpch/tpch/data/10g/nation.csv' delimiter '|' ;
COPY orders(O_ORDERKEY,O_CUSTKEY,O_ORDERSTATUS,O_TOTALPRICE,O_ORDERDATE,O_ORDERPRIORITY,O_CLERK,O_SHIPPRIORITY,O_COMMENT) FROM   '/data/tpch/tpch/data/10g/orders.csv' delimiter '|' ;
COPY partsupp(PS_PARTKEY,PS_SUPPKEY,PS_AVAILQTY,PS_SUPPLYCOST,PS_COMMENT) FROM '/data/tpch/tpch/data/10g/partsupp.csv' delimiter '|' ;
COPY part(P_PARTKEY,P_NAME,P_MFGR,P_BRAND,P_TYPE,P_SIZE,P_CONTAINER,P_RETAILPRICE,P_COMMENT) FROM     '/data/tpch/tpch/data/10g/part.csv' delimiter '|' ;
COPY region(R_REGIONKEY,R_NAME,R_COMMENT) FROM   '/data/tpch/tpch/data/10g/region.csv' delimiter '|' ;
COPY supplier(S_SUPPKEY,S_NAME,S_ADDRESS,S_NATIONKEY,S_PHONE,S_ACCTBAL,S_COMMENT) FROM '/data/tpch/tpch/data/10g/supplier.csv' delimiter '|' ;

3、PostgreSQL创建主外键语句

--PRIMARY KEY
ALTER TABLE PART ADD PRIMARY KEY (P_PARTKEY);
ALTER TABLE SUPPLIER ADD PRIMARY KEY (S_SUPPKEY);
ALTER TABLE PARTSUPP ADD PRIMARY KEY (PS_PARTKEY, PS_SUPPKEY);
ALTER TABLE CUSTOMER ADD PRIMARY KEY (C_CUSTKEY);
ALTER TABLE ORDERS ADD PRIMARY KEY (O_ORDERKEY);
ALTER TABLE LINEITEM ADD PRIMARY KEY (L_ORDERKEY, L_LINENUMBER);
ALTER TABLE NATION ADD PRIMARY KEY (N_NATIONKEY);
ALTER TABLE REGION ADD PRIMARY KEY (R_REGIONKEY);

-- FOREIGN KEY
ALTER TABLE SUPPLIER ADD FOREIGN KEY (S_NATIONKEY) REFERENCES NATION(N_NATIONKEY);
ALTER TABLE PARTSUPP ADD FOREIGN KEY (PS_PARTKEY) REFERENCES PART(P_PARTKEY);
ALTER TABLE PARTSUPP ADD FOREIGN KEY (PS_SUPPKEY) REFERENCES SUPPLIER(S_SUPPKEY);
ALTER TABLE CUSTOMER ADD FOREIGN KEY (C_NATIONKEY) REFERENCES NATION(N_NATIONKEY);
ALTER TABLE ORDERS ADD FOREIGN KEY (O_CUSTKEY) REFERENCES CUSTOMER(C_CUSTKEY);
ALTER TABLE LINEITEM ADD FOREIGN KEY (L_ORDERKEY) REFERENCES ORDERS(O_ORDERKEY);
ALTER TABLE LINEITEM ADD FOREIGN KEY (L_PARTKEY,L_SUPPKEY) REFERENCES PARTSUPP(PS_PARTKEY,PS_SUPPKEY);
ALTER TABLE NATION ADD FOREIGN KEY (N_REGIONKEY) REFERENCES REGION(R_REGIONKEY);
    原文作者:clorislam_cmm
    原文地址: https://www.jianshu.com/p/83e670cf3ffb
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞