範例 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

範例

下列範例示範 Amazon Redshift CREATETABLE陳述式中的各種資料欄和資料表屬性。如需 CREATE 的詳細資訊TABLE,包括參數定義,請參閱 CREATE TABLE

許多範例使用TICKIT範例資料集中的資料表和資料。如需詳細資訊, 請參閱範本資料庫

您可以在 CREATE TABLE 命令中使用資料庫名稱和結構描述名稱作為資料表名稱的字首。例如:dev_database.public.sales。資料庫名稱必須是您所連線的資料庫。任何在另一個資料庫中建立資料庫物件的嘗試都會失敗,並顯示操作無效錯誤。

建立含有分佈索引鍵、複合排序索引鍵和壓縮的資料表

下列範例會在TICKIT資料庫中建立SALES資料表,並針對數個資料欄定義壓縮。LISTID 會宣告為分發金鑰,LISTID並將 SELLERID 宣告為多欄複合排序金鑰。另外也會為資料表定義主索引鍵和外部索引鍵限制條件。在建立範例中的資料表之前,如果UNIQUE沒有限制,您可能需要將限制新增至外部索引鍵參考的每個資料欄。

create table sales( salesid integer not null, listid integer not null, sellerid integer not null, buyerid integer not null, eventid integer not null encode mostly16, dateid smallint not null, qtysold smallint not null encode mostly8, pricepaid decimal(8,2) encode delta32k, commission decimal(8,2) encode delta32k, saletime timestamp, primary key(salesid), foreign key(listid) references listing(listid), foreign key(sellerid) references users(userid), foreign key(buyerid) references users(userid), foreign key(dateid) references date(dateid)) distkey(listid) compound sortkey(listid,sellerid);

結果如下:

schemaname | tablename | column | type | encoding | distkey | sortkey | notnull -----------+-----------+------------+-----------------------------+----------+---------+---------+-------- public | sales | salesid | integer | lzo | false | 0 | true public | sales | listid | integer | none | true | 1 | true public | sales | sellerid | integer | none | false | 2 | true public | sales | buyerid | integer | lzo | false | 0 | true public | sales | eventid | integer | mostly16 | false | 0 | true public | sales | dateid | smallint | lzo | false | 0 | true public | sales | qtysold | smallint | mostly8 | false | 0 | true public | sales | pricepaid | numeric(8,2) | delta32k | false | 0 | false public | sales | commission | numeric(8,2) | delta32k | false | 0 | false public | sales | saletime | timestamp without time zone | lzo | false | 0 | false

下列範例會使用不區分大小寫的資料欄 col1 建立資料表 t1。

create table T1 ( col1 Varchar(20) collate case_insensitive ); insert into T1 values ('bob'), ('john'), ('Tom'), ('JOHN'), ('Bob');

查詢資料表:

select * from T1 where col1 = 'John'; col1 ------ john JOHN (2 rows)

使用交錯排序索引鍵建立資料表

下列範例會使用交錯排序索引鍵建立CUSTOMER資料表。

create table customer_interleaved ( c_custkey integer not null, c_name varchar(25) not null, c_address varchar(25) not null, c_city varchar(10) not null, c_nation varchar(15) not null, c_region varchar(12) not null, c_phone varchar(15) not null, c_mktsegment varchar(10) not null) diststyle all interleaved sortkey (c_custkey, c_city, c_mktsegment);

使用 IF 建立資料表 NOT EXISTS

下列範例會建立CITIES資料表,或 不執行任何動作,如果訊息已經存在,則傳回訊息:

create table if not exists cities( cityid integer not null, city varchar(100) not null, state char(2) not null);

建立具有ALL分佈的資料表

下列範例會建立具有ALL分佈的VENUE資料表。

create table venue( venueid smallint not null, venuename varchar(100), venuecity varchar(30), venuestate char(2), venueseats integer, primary key(venueid)) diststyle all;

建立具有EVEN分佈的資料表

下列範例會建立名為 的資料表,MYEVENT其中包含三個資料欄。

create table myevent( eventid int, eventname varchar(200), eventcity varchar(30)) diststyle even;

資料表會均勻分佈且不會排序。資料表沒有宣告DISTKEY或SORTKEY資料欄。

select "column", type, encoding, distkey, sortkey from pg_table_def where tablename = 'myevent'; column | type | encoding | distkey | sortkey -----------+------------------------+----------+---------+--------- eventid | integer | lzo | f | 0 eventname | character varying(200) | lzo | f | 0 eventcity | character varying(30) | lzo | f | 0 (3 rows)

建立LIKE另一個資料表的暫存資料表

下列範例會建立名為 的暫存資料表TEMPEVENT,此資料表會從EVENT資料表繼承其資料欄。

create temp table tempevent(like event);

此資料表也會繼承其父資料表的 DISTKEY和 SORTKEY 屬性:

select "column", type, encoding, distkey, sortkey from pg_table_def where tablename = 'tempevent'; column | type | encoding | distkey | sortkey -----------+-----------------------------+----------+---------+--------- eventid | integer | none | t | 1 venueid | smallint | none | f | 0 catid | smallint | none | f | 0 dateid | smallint | none | f | 0 eventname | character varying(200) | lzo | f | 0 starttime | timestamp without time zone | bytedict | f | 0 (6 rows)

使用資料IDENTITY欄建立資料表

下列範例會建立名為 VENUE_ 的資料表IDENT,其中具有名為 的IDENTITY欄VENUEID。此資料欄從 0 開始,並隨每筆記錄遞增 1。VENUEID 也會宣告為資料表的主要索引鍵。

create table venue_ident(venueid bigint identity(0, 1), venuename varchar(100), venuecity varchar(30), venuestate char(2), venueseats integer, primary key(venueid));

使用預設IDENTITY資料欄建立資料表

以下範例會建立名為 t1 的資料表。此資料表具有名為 的資料IDENTITY欄hist_id和名為 的預設IDENTITY資料欄base_id

CREATE TABLE t1( hist_id BIGINT IDENTITY NOT NULL, /* Cannot be overridden */ base_id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, /* Can be overridden */ business_key varchar(10) , some_field varchar(10) );

將資料列插入至資料表顯示已同時產生 hist_idbase_id 值。

INSERT INTO T1 (business_key, some_field) values ('A','MM');
SELECT * FROM t1; hist_id | base_id | business_key | some_field ---------+---------+--------------+------------ 1 | 1 | A | MM

插入第二列顯示已產生 base_id 的預設值。

INSERT INTO T1 (base_id, business_key, some_field) values (DEFAULT, 'B','MNOP');
SELECT * FROM t1; hist_id | base_id | business_key | some_field ---------+---------+--------------+------------ 1 | 1 | A | MM 2 | 2 | B | MNOP

插入第三列顯示 base_id 的值不需要是唯一的。

INSERT INTO T1 (base_id, business_key, some_field) values (2,'B','MNNN');
SELECT * FROM t1; hist_id | base_id | business_key | some_field ---------+---------+--------------+------------ 1 | 1 | A | MM 2 | 2 | B | MNOP 3 | 2 | B | MNNN

建立具有DEFAULT資料欄值的資料表

下列範例會建立宣告每欄預設值的CATEGORYDEF資料表:

create table categorydef( catid smallint not null default 0, catgroup varchar(10) default 'Special', catname varchar(10) default 'Other', catdesc varchar(50) default 'Special events', primary key(catid)); insert into categorydef values(default,default,default,default);
select * from categorydef; catid | catgroup | catname | catdesc -------+----------+---------+---------------- 0 | Special | Other | Special events (1 row)

DISTSTYLE、 DISTKEY和 SORTKEY選項

下列範例顯示 DISTKEY、 SORTKEY和 DISTSTYLE選項的運作方式。在此範例中, COL1是分發金鑰;因此,分發樣式必須設定為 KEY或未設定為 。根據預設,資料表沒有排序索引鍵,因此不會排序:

create table t1(col1 int distkey, col2 int) diststyle key;
select "column", type, encoding, distkey, sortkey from pg_table_def where tablename = 't1'; column | type | encoding | distkey | sortkey -------+---------+----------+---------+--------- col1 | integer | az64 | t | 0 col2 | integer | az64 | f | 0

在下列範例中,會將同一個資料欄定義為分佈索引鍵和排序索引鍵。同樣地,分佈樣式必須設定為 KEY 或未設定為 。

create table t2(col1 int distkey sortkey, col2 int);
select "column", type, encoding, distkey, sortkey from pg_table_def where tablename = 't2'; column | type | encoding | distkey | sortkey -------+---------+----------+---------+--------- col1 | integer | none | t | 1 col2 | integer | az64 | f | 0

在下列範例中,沒有資料欄設定為分佈索引鍵,COL2設定為排序索引鍵,分佈樣式設定為 ALL:

create table t3(col1 int, col2 int sortkey) diststyle all;
select "column", type, encoding, distkey, sortkey from pg_table_def where tablename = 't3'; Column | Type | Encoding | DistKey | SortKey -------+---------+----------+---------+-------- col1 | integer | az64 | f | 0 col2 | integer | none | f | 1

在下列範例中,分佈樣式設定為 EVEN,而且未明確定義排序索引鍵;因此資料表會平均分佈,但不會排序。

create table t4(col1 int, col2 int) diststyle even;
select "column", type, encoding, distkey, sortkey from pg_table_def where tablename = 't4'; column | type |encoding | distkey | sortkey --------+---------+---------+---------+-------- col1 | integer | az64 | f | 0 col2 | integer | az64 | f | 0

使用 ENCODEAUTO選項建立資料表

下列範例會建立具有自動壓縮編碼的 t1 資料表。ENCODE AUTO 當您未指定任何資料欄的編碼類型時, 是資料表的預設值。

create table t1(c0 int, c1 varchar);

下列範例會指定 來建立t2具有自動壓縮編碼ENCODE的資料表AUTO。

create table t2(c0 int, c1 varchar) encode auto;

下列範例會指定 來建立t3具有自動壓縮編碼ENCODE的資料表AUTO。資料欄的定義初始編碼類型c0為 DELTA。如果其他編碼提供更好的查詢效能,Amazon Redshift 可以變更編碼。

create table t3(c0 int encode delta, c1 varchar) encode auto;

下列範例會指定 來建立t4具有自動壓縮編碼ENCODE的資料表AUTO。資料欄的初始編碼c0為 定義DELTA,資料欄的初始編碼c1為 定義LZO。如果其他編碼提供更好的查詢效能,Amazon Redshift 可以變更這些編碼。

create table t4(c0 int encode delta, c1 varchar encode lzo) encode auto;