本文介紹AnalyticDB for MySQL的CREATE TABLE
建表文法。您將瞭解到如何建立分區表和複製表,以及如何定義表的分布鍵、分區鍵、索引、生命週期、冷熱資料分層等。
文法
CREATE TABLE [IF NOT EXISTS] table_name
({column_name column_type [column_attributes] [ column_constraints ] [COMMENT 'column_comment']
| table_constraints}
[, ... ])
[table_attribute]
[partition_options]
[storage_policy]
[block_size]
[engine]
[rt_engine]
[table_properties]
[AS query_expr]
[COMMENT 'table_comment']
column_attributes:
[DEFAULT {constant | CURRENT_TIMESTAMP}]
[AUTO_INCREMENT]
column_constraints:
[{NOT NULL|NULL} ]
[PRIMARY KEY]
table_constraints:
[{INDEX|KEY} [index_name] (column_name,...)]
[{INDEX|KEY} [index_name] (column_name->'$[*]')]
[FULLTEXT [INDEX|KEY] [index_name] (column_name) [index_option]] [,...]
[PRIMARY KEY [index_name] (column_name,...)]
[CLUSTERED KEY [index_name] (column_name,...)]
[[CONSTRAINT [symbol]] FOREIGN KEY (fk_column_name) REFERENCES pk_table_name (pk_column_name)][,...]
[ANN INDEX [index_name] (column_name,...) [index_option]] [,...]
table_attribute:
DISTRIBUTED BY HASH(column_name,...) | DISTRIBUTED BY BROADCAST
partition_options:
PARTITION BY
{VALUE(column_name) | VALUE(DATE_FORMAT(column_name, 'format')) | VALUE(FROM_UNIXTIME(column_name, 'format'))}
LIFECYCLE N
storage_policy:
STORAGE_POLICY= {'HOT'|'COLD'|'MIXED' {hot_partition_count=N}}
block_size:
BLOCK_SIZE= VALUE
engine:
ENGINE= 'XUANWU|XUANWU_V2'
參數
table_name、column_name、column_type、COMMENT
樣本
建立分區表並設定生命週期
建立普通表customer,login_time
、customer_id
、phone_num
為複合主鍵, customer_id
為分布鍵,login_time
為分區鍵,分區的生命週期為30。
所有分區,按分區鍵login_time
的值(例如,20231202,20231201等)從大到小排序,僅保留分區索引值最大的30個分區,當第31個分區資料寫入時,自動刪除最小的第1個分區。
假設,第1天login_time的值為20231201,第二天login_time的值為20231202,依次類推,第30天login_time的值為20231230。當第31天login_time為20231231的資料寫入時,最小的分區(即'20231201'分區)資料將會被自動刪除,從而實現只保留最近30天的資料。
CREATE TABLE customer (
customer_id BIGINT NOT NULL COMMENT '顧客ID',
customer_name VARCHAR NOT NULL COMMENT '顧客姓名',
phone_num BIGINT NOT NULL COMMENT '電話',
city_name VARCHAR NOT NULL COMMENT '所屬城市',
sex INT NOT NULL COMMENT '性別',
id_number VARCHAR NOT NULL COMMENT '社會安全號碼碼',
home_address VARCHAR NOT NULL COMMENT '家庭住址',
office_address VARCHAR NOT NULL COMMENT '辦公地址',
age INT NOT NULL COMMENT '年齡',
login_time TIMESTAMP NOT NULL COMMENT '登入時間',
PRIMARY KEY (login_time,customer_id,phone_num)
)
DISTRIBUTED BY HASH(customer_id)
PARTITION BY VALUE(DATE_FORMAT(login_time, '%Y%m%d')) LIFECYCLE 30
COMMENT '客戶資訊表';
建立表(未定義分布鍵)
未定義分布鍵,自動將主鍵作為分布鍵
表定義了主鍵但未定義分布鍵,AnalyticDB for MySQL預設將主鍵作為分布鍵。
CREATE TABLE orders (
order_id BIGINT NOT NULL COMMENT '訂單ID',
customer_id INT NOT NULL COMMENT '顧客ID',
order_status VARCHAR(1) NOT NULL COMMENT '訂單狀態',
total_price DECIMAL(15, 2) NOT NULL COMMENT '訂單金額',
order_date DATE NOT NULL COMMENT '訂單日期',
PRIMARY KEY(order_id,order_date)
);
查詢建表語句,可以看到主鍵order_id和order_date被採納為分布鍵。
SHOW CREATE TABLE orders;
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------+
| orders | CREATE TABLE `orders` ( |
| | `order_id` bigint NOT NULL COMMENT '訂單ID', |
| | `customer_id` int NOT NULL COMMENT '顧客ID', |
| | `order_status` varchar(1) NOT NULL COMMENT '訂單狀態', |
| | `total_price` decimal(15, 2) NOT NULL COMMENT '訂單金額', |
| | `order_date` date NOT NULL COMMENT '訂單日期', |
| | PRIMARY KEY (`order_id`,`order_date`) |
| | ) DISTRIBUTED BY HASH(`order_id`,`order_date`) INDEX_ALL='Y' STORAGE_POLICY='HOT' ENGINE='XUANWU' TABLE_PROPERTIES='{"format":"columnstore"}' |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.04 sec)
未定義主鍵,自動增加主鍵
表未定義主鍵,也未定義分布鍵,AnalyticDB for MySQL將添加一個列__adb_auto_id__
作為主鍵和分布鍵。
CREATE TABLE orders_new (
order_id BIGINT NOT NULL COMMENT '訂單ID',
customer_id INT NOT NULL COMMENT '顧客ID',
order_status VARCHAR(1) NOT NULL COMMENT '訂單狀態',
total_price DECIMAL(15, 2) NOT NULL COMMENT '訂單金額',
order_date DATE NOT NULL COMMENT '訂單日期'
);
查詢建表語句,可以看到表中自動增加一個自增列__adb_auto_id__,該自增列作為表的主鍵和分布鍵。
SHOW CREATE TABLE orders_new;
+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------+
| orders_new | CREATE TABLE `orders_new` ( |
| | `__adb_auto_id__` bigint AUTO_INCREMENT, |
| | `order_id` bigint NOT NULL COMMENT '訂單ID', |
| | `customer_id` int NOT NULL COMMENT '顧客ID', |
| | `order_status` varchar(1) NOT NULL COMMENT '訂單狀態', |
| | `total_price` decimal(15, 2) NOT NULL COMMENT '訂單金額', |
| | `order_date` date NOT NULL COMMENT '訂單日期', |
| | PRIMARY KEY (`__adb_auto_id__`) |
| | ) DISTRIBUTED BY HASH(`__adb_auto_id__`) INDEX_ALL='Y' STORAGE_POLICY='HOT' ENGINE='XUANWU' TABLE_PROPERTIES='{"format":"columnstore"}' |
+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.04 sec)
建立表(未定義分區鍵)
建立表supplier,supplier_id
為自增列,分布鍵為supplier_id
,按照supplier_id
值進行HASH分區。
CREATE TABLE supplier (
supplier_id BIGINT AUTO_INCREMENT PRIMARY KEY,
supplier_name VARCHAR,
address INT,
phone VARCHAR
)
DISTRIBUTED BY HASH(supplier_id);
定義冷熱資料存放區策略
定義冷(COLD)儲存策略
CREATE TABLE item (
order_id BIGINT NOT NULL,
item_id INT NOT NULL,
quantity DECIMAL(15, 2) NOT NULL,
discount DECIMAL(15, 2) NOT NULL,
shipdate DATE NOT NULL,
PRIMARY KEY (order_id,item_id,shipdate)
)
DISTRIBUTED BY HASH(item_id)
PARTITION BY VALUE(date_format(shipdate, '%Y%m')) LIFECYCLE 200
STORAGE_POLICY='COLD';
定義熱(HOT)儲存策略
CREATE TABLE item (
order_id BIGINT NOT NULL,
item_id INT NOT NULL,
quantity DECIMAL(15, 2) NOT NULL,
discount DECIMAL(15, 2) NOT NULL,
shipdate DECIMAL NOT NULL,
PRIMARY KEY (order_id,item_id,shipdate)
)
DISTRIBUTED BY HASH(item_id)
PARTITION BY VALUE(date_format(shipdate, '%Y%m')) LIFECYCLE 200
STORAGE_POLICY='HOT';
定義混合(MIXED)儲存策略,同時指定熱分區數量為16個
CREATE TABLE item (
order_id BIGINT NOT NULL,
item_id INT NOT NULL,
quantity DECIMAL(15, 2) NOT NULL,
discount DECIMAL(15, 2) NOT NULL,
shipdate DATE NOT NULL,
PRIMARY KEY (order_id,item_id,shipdate)
)
DISTRIBUTED BY HASH(item_id)
PARTITION BY VALUE(date_format(shipdate, '%Y%m')) LIFECYCLE 200
STORAGE_POLICY='MIXED' HOT_PARTITION_COUNT=16;
定義全文索引
為content列建立全文索引,索引名稱為fidx_c。
CREATE TABLE fulltext_tb (
id INT,
content VARCHAR,
keyword VARCHAR,
FULLTEXT INDEX fidx_c(content),
PRIMARY KEY (id)
)
DISTRIBUTED BY HASH(id);
關於建立和變更全文索引的更多內容,請參見建立全文索引。
關於全文檢索索引,請參見全文檢索索引。
定義向量索引
定義short_feature、float_feature為向量列,類型是array<float>,向量維數為4。
根據short_feature建立向量索引short_feature_index,根據float_feature建立向量索引float_feature_index。
CREATE TABLE fact_tb (
xid BIGINT NOT NULL,
cid BIGINT NOT NULL,
uid VARCHAR NOT NULL,
vid VARCHAR NOT NULL,
wid VARCHAR NOT NULL,
short_feature array<smallint>(4),
float_feature array<float>(4),
ann index short_feature_index(short_feature),
ann index float_feature_index(float_feature),
PRIMARY KEY (xid, cid, vid)
)
DISTRIBUTED BY HASH(xid) PARTITION BY VALUE(cid) LIFECYCLE 4;
更多關於向量索引和向量檢索的內容,請參見向量檢索。
定義外鍵索引
新增一個名為store_returns
的表,通過使用外鍵文法FOREIGN KEY
將sr_item_sk
列和customer
表的主鍵列customer_id
關聯起來。
CREATE TABLE store_returns (
sr_sale_id BIGINT NOT NULL PRIMARY KEY,
sr_store_sk BIGINT,
sr_item_sk BIGINT NOT NULL,
FOREIGN KEY (sr_item_sk) REFERENCES customer (customer_id)
);
定義JSON Array索引
為vj列建立JSON Array索引,索引名稱為idx_vj。
CREATE TABLE json(
id INT,
vj JSON,
INDEX idx_vj(vj->'$[*]')
)
DISTRIBUTED BY HASH(id);
關於建立和變更JSON Array索引的更多內容,請參見建立JSON Array索引和JSON Array索引。
常見問題
列屬性和列約束
分布鍵、分區鍵與生命週期
索引
列存
其他
常見報錯
相關文檔
向表中寫入資料,請參見INSERT INTO。
將查詢結果寫入或覆蓋寫入,請參見INSERT SELECT FROM或INSERT OVERWRITE SELECT。
將RDS、MaxCompute、OSS或其他資料來源的資料匯入,請參見資料匯入。