GreenPlumデータベーステーブルのOWNERの変更、NULL値データの挿入、および共通データ型
21165 ワード
一度にテーブルを作成する際にエラーを使用したユーザは,gpadminユーザの下にテーブルを構築したが,GreenPlumデータベースはテーブル操作時に主にユーザではなくSCHEMAを用いたが,権限にかかわる問題は,テーブルのOWNERを絶対に修正することである.ORACLEデータベースでは、テーブルを直接変更するOWNERはサポートされていませんが、GreenPlumデータベースはサポートされています.GreenPlumデータベースにおけるSCHEMAとOWNERの関係は,以下の情報から直感的に分かる.
GreenPlumデータベースのSCHEMAとユーザとORACLEの概念は全く異なり、上記の情報から分かるように、1つのSCHEMAは複数のユーザのオブジェクトを含むことができ、テーブル操作時にSCHEMAを使用する.OWNERではなくTABLENAMETABLENAME、以下のプレゼンテーションをご覧ください.
同意SCHEMAでは,異なるユーザが同じ名前のオブジェクトを作成することはできない.
異なるユーザーが直接相手のテーブルにアクセスするには、スーパーユーザーを除いて、相手の権限が必要です.テーブルのOWNERを変更するには、alter tableコマンドで直接変更できます.
GreenPlumデータベースは、空の値を挿入する場合、ORACLEデータベースと同様に、文字タイプのフィールドを直接「」で置き換えることができます.
しかし、数字や日付のタイプでは、この方法ではだめです.''GreenPlumデータベースでは文字のタイプを表しています.
数値または日付タイプのデータについて、制御を挿入する場合はnullを使用して明示的に指定します.
ついでにGreenPlumデータベースでよく使われるデータ型を紹介します.よく使われる整数型の数字型はint、bigint、smallintで、よく使われる小数型はnumericとdecimalで、よく使われる自己増加型はserialとbigserialです.次に、数値タイプのテーブルを作成します.
smallintは短い整数のサブタイプであり、サポート範囲は負32 K(32768)から正32 K-1(32767)である.intは標準的な整数型であり、サポート範囲は正負2 G(-21147483648~2147483647)である.bigintはロング整数型デジタルタイプで、正負9 E(-922337203685475808~922337203685475807)をサポートしています.numericは小数型で制限はありません.serialは自己成長デジタルタイプで、サポート範囲は1~2 G(最大値2147483647).bigserialはロングタイプの自己成長デジタルタイプで、最大9 E長(最大値922337203685475807)をサポートしています.
文字タイプを見てみると、文字タイプは他のデータベースと基本的に同じで、長さと長さの区別タイプでもあります.次に、これらのタイプを含むテーブルを作成します.
charタイプは定長文字タイプで、最大10485760バイトをサポートし、スペースで揃えるには不足しています.varcharタイプは長くなる文字タイプで、最大10485760バイトをサポートします.text文字タイプで、長さ制限はありません.
時間タイプのフィールドを見て、主に使用できる時間タイプにはdate、time、timestampタイプが含まれています.次に、時間タイプフィールドのテーブルを作成します.
次にデータを挿入し、データストレージフォーマットを確認します.
Dataタイプは、ORACLEデータベースのdateタイプとは異なる日付タイプのデータ(年月日)のみが格納されます.timeタイプは、ミリ秒まで正確に1日以内の時間(時間分秒)を格納します.timestampタイプは、ミリ秒まで正確な日付と時間(data+time)タイプのデータを格納します.
dbdream=# \d
List of relations
Schema | Name | Type | Owner | Storage
--------+---------------+-------+---------+---------
public | med_ord_pgm_d | table | gpadmin | heap
public | ord_pay | table | gpadmin | heap
public | t_ctas | table | dbdream | heap
(3 rows)
GreenPlumデータベースのSCHEMAとユーザとORACLEの概念は全く異なり、上記の情報から分かるように、1つのSCHEMAは複数のユーザのオブジェクトを含むことができ、テーブル操作時にSCHEMAを使用する.OWNERではなくTABLENAMETABLENAME、以下のプレゼンテーションをご覧ください.
dbdream=> \c
You are now connected to database "dbdream" as user "dbdream".
dbdream=> select * from dbdream.t_ctas;
ERROR: schema "dbdream" does not exist
LINE 1: select * from dbdream.t_ctas;
dbdream=> select * from public.t_ctas;
name | id
------+----
(0 rows)
同意SCHEMAでは,異なるユーザが同じ名前のオブジェクトを作成することはできない.
dbdream=> \c
You are now connected to database "dbdream" as user "dbdream".
dbdream=> create table med_ord_pgm_d(id int);
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' as the Greenplum Database data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
ERROR: relation "med_ord_pgm_d" already exists
異なるユーザーが直接相手のテーブルにアクセスするには、スーパーユーザーを除いて、相手の権限が必要です.テーブルのOWNERを変更するには、alter tableコマンドで直接変更できます.
dbdream=# ALTER TABLE ORD_PAY owner to dbdream;
ALTER TABLE
dbdream=# \d
List of relations
Schema | Name | Type | Owner | Storage
--------+---------------+-------+---------+---------
public | med_ord_pgm_d | table | gpadmin | heap
public | ord_pay | table | dbdream | heap
public | t_ctas | table | dbdream | heap
(3 rows)
GreenPlumデータベースは、空の値を挿入する場合、ORACLEデータベースと同様に、文字タイプのフィールドを直接「」で置き換えることができます.
dbdream=> \d t_ctas
Table "public.t_ctas"
Column | Type | Modifiers
--------+-----------------------+-----------
name | character varying(10) |
id | integer |
Distributed by: (name)
Tablespace: "tbs1"
dbdream=> insert into t_ctas values ('',1);
INSERT 0 1
しかし、数字や日付のタイプでは、この方法ではだめです.''GreenPlumデータベースでは文字のタイプを表しています.
dbdream=> insert into t_ctas values('a','');
ERROR: invalid input syntax for integer: ""
数値または日付タイプのデータについて、制御を挿入する場合はnullを使用して明示的に指定します.
dbdream=> insert into t_ctas values('a',null);
INSERT 0 1
ついでにGreenPlumデータベースでよく使われるデータ型を紹介します.よく使われる整数型の数字型はint、bigint、smallintで、よく使われる小数型はnumericとdecimalで、よく使われる自己増加型はserialとbigserialです.次に、数値タイプのテーブルを作成します.
dbdream=> create table t_int(autoinc serial,small smallint,standard int,big bigint,acc numeric) Distributed by(autoinc);
NOTICE: CREATE TABLE will create implicit sequence "t_int_autoinc_seq" for serial column "t_int.autoinc"
CREATE TABLE
dbdream=> \d t_int
Table "public.t_int"
Column | Type | Modifiers
----------+----------+---------------------------------------------------------
autoinc | integer | not null default nextval('t_int_autoinc_seq'::regclass)
small | smallint |
standard | integer |
big | bigint |
acc | numeric |
Distributed by: (autoinc)
Tablespace: "tbs1"
smallintは短い整数のサブタイプであり、サポート範囲は負32 K(32768)から正32 K-1(32767)である.intは標準的な整数型であり、サポート範囲は正負2 G(-21147483648~2147483647)である.bigintはロング整数型デジタルタイプで、正負9 E(-922337203685475808~922337203685475807)をサポートしています.numericは小数型で制限はありません.serialは自己成長デジタルタイプで、サポート範囲は1~2 G(最大値2147483647).bigserialはロングタイプの自己成長デジタルタイプで、最大9 E長(最大値922337203685475807)をサポートしています.
文字タイプを見てみると、文字タイプは他のデータベースと基本的に同じで、長さと長さの区別タイプでもあります.次に、これらのタイプを含むテーブルを作成します.
dbdream=> create table t_char(c char(10),v varchar(10),t text) DISTRIBUTED BY(c);
CREATE TABLE
dbdream=> \d t_char
Table "public.t_char"
Column | Type | Modifiers
--------+-----------------------+-----------
c | character(10) |
v | character varying(10) |
t | text |
Distributed by: (c)
Tablespace: "tbs1"
charタイプは定長文字タイプで、最大10485760バイトをサポートし、スペースで揃えるには不足しています.varcharタイプは長くなる文字タイプで、最大10485760バイトをサポートします.text文字タイプで、長さ制限はありません.
時間タイプのフィールドを見て、主に使用できる時間タイプにはdate、time、timestampタイプが含まれています.次に、時間タイプフィールドのテーブルを作成します.
dbdream=> create table t_time(d date,t time,ts timestamp) DISTRIBUTED BY(d);
CREATE TABLE
dbdream=> \d t_time
Table "public.t_time"
Column | Type | Modifiers
--------+-----------------------------+-----------
d | date |
t | time without time zone |
ts | timestamp without time zone |
Distributed by: (d)
Tablespace: "tbs1"
次にデータを挿入し、データストレージフォーマットを確認します.
dbdream=> insert into t_time values(current_date,current_time,current_timestamp);
INSERT 0 1
dbdream=> select * from t_time;
d | t | ts
------------+-----------------+----------------------------
2016-01-29 | 17:29:49.197889 | 2016-01-29 17:29:49.197889
(1 row)
Dataタイプは、ORACLEデータベースのdateタイプとは異なる日付タイプのデータ(年月日)のみが格納されます.timeタイプは、ミリ秒まで正確に1日以内の時間(時間分秒)を格納します.timestampタイプは、ミリ秒まで正確な日付と時間(data+time)タイプのデータを格納します.