閱讀275 返回首頁    go iPhone_iPad_Mac_手機_平板_蘋果apple


分區管理__分區_SQL語法參考_雲數據庫 OceanBase-阿裏雲

分區管理主要是指添加、刪除、重新定義、合並或拆分已經存在的分區。所有這些操作都可以通過使用 ALTER TABLE 命令的分區擴展來實現。

RANGE分區

刪除分區以及分區數據

語法

ALTER TABLE table_name DROP PARTITION partiton_name;

舉例

使用下麵的 CREATE TABLE 和 INSERT 語句創建了一個按照 RANGE 分區的表,並且已經插入了 10 條記錄:

mysql> CREATE TABLE tr (id INT, name VARCHAR(50), purchased DATE)
     -> PARTITION BY RANGE(YEAR(purchased))
     -> (
     -> PARTITION p0 VALUES LESS THAN (1990),
     -> PARTITION p1 VALUES LESS THAN (1995),
     -> PARTITION p2 VALUES LESS THAN (2000),
     -> PARTITION p3 VALUES LESS THAN (2005)
     -> );
 Query OK, 0 rows affected (0.01 sec)

 mysql> INSERT INTO tr VALUES
     -> (1, 'desk organiser', '2003-10-15'),
     -> (2, 'CD player', '1993-11-05'),
     -> (3, 'TV set', '1996-03-10'),
     -> (4, 'bookcase', '1982-01-10'),
     -> (5, 'exercise bike', '2004-05-09'),
     -> (6, 'sofa', '1987-06-05'),
     -> (7, 'popcorn maker', '2001-11-22'),
     -> (8, 'aquarium', '1992-08-04'),
     -> (9, 'study desk', '1984-09-16'),
     -> (10, 'lava lamp', '1998-12-25');
 Query OK, 10 rows affected (0.01 sec)

可以通過使用下麵的命令查看那些記錄已經插入到了分區 p2 中:

mysql> SELECT * FROM tr
    -> WHERE purchased BETWEEN '1995-01-01' AND '1999-12-31';
+------+-----------+------------+
| id | name | purchased |
+------+-----------+------------+
| 3 | TV set | 1996-03-10 |
| 10 | lava lamp | 1998-12-25 |
+------+-----------+------------+
2 rows in set (0.00 sec)

要刪除名字為 p2 的分區,執行下麵的命令:

mysql> ALTER TABLE tr DROP PARTITION p2;
Query OK, 0 rows affected (0.03 sec)

記住下麵一點非常重要:當刪除了一個分區,也同時刪除了該分區中所有的數據。可以通過重新運行前麵的 SELECT 查詢來驗證這一點:

mysql> SELECT * FROM tr WHERE purchased
     -> BETWEEN '1995-01-01' AND '1999-12-31';
Empty set (0.00 sec)

刪除數據:保留表的結構,包括分區

語法

TRUNCATE TABLE table_name

舉例

接上麵的例子,刪除 tr 表的所有內部。

mysql> TRUNCATE TABLE tr;
Query OK, 0 rows affected (0.25 sec)

查看表的內容為空

mysql> select * from tr;
Empty set (0.00 sec)

查看表的數據結構

mysql> show create table tr;
 +-------+------------------------------------------------------------
 | Table | Create Table
 +-------+------------------------------------------------------------
 | tr | CREATE TABLE `tr` (
 `id` int(11) DEFAULT NULL,
 `name` VARCHAR(50) DEFAULT NULL,
 `purchased` date DEFAULT NULL
 )
 /*!50100 PARTITION BY RANGE (YEAR(purchased))
     (PARTITION p0 VALUES LESS THAN (1990) ENGINE = InnoDB,
     PARTITION p1 VALUES LESS THAN (1995) ENGINE = InnoDB,
     PARTITION p3 VALUES LESS THAN (2005) ENGINE = InnoDB) */ |
 +-------+------------------------------------------------------------
 1 row in set (0.00 sec)

添加分區:為已經分區的表添加後續分區

語法

ALTER TABLE ... ADD PARTITION

舉例

例如,假設有一個包含你所在組織的全體成員數據的分區表,該表的定義如下:

CREATE TABLE members (
 id INT,
 fname VARCHAR(25),
 lname VARCHAR(25),
 dob DATE
 )
 PARTITION BY RANGE(YEAR(dob)) (
     PARTITION p0 VALUES LESS THAN (1970),
     PARTITION p1 VALUES LESS THAN (1980),
     PARTITION p2 VALUES LESS THAN (1990)
 );

進一步假設成員的最小年紀是 16 歲。隨著日曆接近 2005 年年底,你會認識到不久將要接納 1990 年(以及以後年份)出生的成員。可以按照下麵的方式,修改成員表來容納出生在 1990-1999 年之間的成員:

ALTER TABLE members ADD PARTITION (PARTITION p3 VALUES LESS THAN (2000));

約束

對於通過 RANGE 分區的表,隻可以使用 ADD PARTITION 添加新的分區到分區列表的高端。設法通過這種方式在現有分區的前麵或之間增加一個新的分區,將會導致下麵的一個錯誤:

mysql> ALTER TABLE members ADD PARTITION (PARTITION p4 VALUES LESS THAN (1960));
ERROR 1493 (HY000): VALUES LESS THAN value must be strictly increasing for each partition

分區擴展

分區可以通過 REOGANIZE PARTITION 來實現拆分或合並分區等。

語法

ALTER TABLE tblname REORGANIZE PARTITION partition_list INTO (partition_definitions);

其中,tbl_name 是分區表的名稱,partition_list 是通過逗號分開的、一個或多個將要被改變的現有分區的列表。partition_definitions 是一個是通過逗號分開的、新分區定義的列表,它遵循與用在“CREATE TABLE”中的 partition_definitions相同的規則。把多少個分區合並到一個分區或把一個分區拆分成多少個分區方麵,沒有限製。

舉例

mysql> show create table members;
+---------+----------------------------------------------------------
| Table | Create Table
+---------+----------------------------------------------------------
| members | CREATE TABLE `members` (
 `id` int(11) DEFAULT NULL,
 `fname` VARCHAR(25) DEFAULT NULL,
 `lname` VARCHAR(25) DEFAULT NULL,
 `dob` date DEFAULT NULL
 )
 /*!50100 PARTITION BY RANGE (YEAR(dob))
     (PARTITION p0 VALUES LESS THAN (1970),
     PARTITION p1 VALUES LESS THAN (1980),
     PARTITION p2 VALUES LESS THAN (1990),
     PARTITION p3 VALUES LESS THAN (2000) */ |
 +---------+----------------------------------------------------------
 1 row in set (0.01 sec)

假定想要把表示出生在 1960 年前成員的所有行移入到一個分開的分區中。正如我們前麵看到的,不能通過使用“ALTER TABLE ... ADD PARTITION”來實現這一點。但是,要實現這一點,可以使用 ALTER TABLE 上的另外一個與分區有關的擴展,具體實現如下:

mysql> ALTER TABLE members REORGANIZE PARTITION p0 INTO (
     -> PARTITION s0 VALUES LESS THAN (1960),
     -> PARTITION s1 VALUES LESS THAN (1970)
     -> );
 Query OK, 0 rows affected (0.53 sec)
 Records: 0 Duplicates: 0 Warnings: 0
 mysql> show create table members; //查看結果
 +---------+----------------------------------------------------------
 | Table   | Create Table
 +---------+----------------------------------------------------------
 | members | CREATE TABLE `members` (
     `id` int(11) DEFAULT NULL,
     `fname` VARCHAR(25) DEFAULT NULL,
     `lname` VARCHAR(25) DEFAULT NULL,
     `dob` date DEFAULT NULL
     )
 /*!50100 PARTITION BY RANGE (YEAR(dob))
     (PARTITION s0 VALUES LESS THAN (1960),
     PARTITION s1 VALUES LESS THAN (1970),
     PARTITION p1 VALUES LESS THAN (1980),
     PARTITION p2 VALUES LESS THAN (1990),
     PARTITION p3 VALUES LESS THAN (2000) */ |
 +---------+----------------------------------------------------------
 1 row in set (0.02 sec)

可以重新組織成員表的五個分區成兩個分區,具體實現如下:

mysql> ALTER TABLE members REORGANIZE PARTITION s0,s1,p1,p2,p3 INTO (
     -> PARTITION m0 VALUES LESS THAN (1980),
    -> PARTITION m1 VALUES LESS THAN (2000));
Query OK, 0 rows affected (0.73 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table members; //查看結果
+---------+----------------------------------------------------------
| Table   | Create Table
+---------+----------------------------------------------------------
| members | CREATE TABLE `members` (
    `id` int(11) DEFAULT NULL,
    `fname` VARCHAR(25) DEFAULT NULL,
    `lname` VARCHAR(25) DEFAULT NULL,
    `dob` date DEFAULT NULL
)
/*!50100 PARTITION BY RANGE (YEAR(dob))
    (PARTITION m0 VALUES LESS THAN (1980) ENGINE = InnoDB,
    PARTITION m1 VALUES LESS THAN (2000) ENGINE = InnoDB) */ |
+---------+----------------------------------------------------------
1 row in set (0.01 sec)

HASH分區

合並分區

語法

ALTER TABLE ... COALESCE PARTITION

舉例

例如,假定有一個包含顧客信息數據的表,它被分成了 12 個分區。該顧客表的定義如下:

CREATE TABLE clients (
 id INT,
 fname VARCHAR(30),
 lname VARCHAR(30),
 signed DATE
 )
 PARTITION BY HASH( MONTH(signed) )
     PARTITIONS 12;

要減少分區的數量從 12 到 6,執行下麵的 ALTER TABLE 命令:

mysql> ALTER TABLE clients COALESCE PARTITION 6;
Query OK, 0 rows affected (0.02 sec)

約束

COALESCE 不能用來增加分區的數量,如果你嚐試這麼做,結果會出現類似於下麵的錯誤:

mysql> ALTER TABLE clients COALESCE PARTITION 18;
ERROR 1508 (HY000): Cannot remove all partitions, use DROP TABLE instead

增加分區

語法

ALTER TABLE ... ADD PARTITION

舉例

在表 clients 中,把原有 6 個分區,增加 18 個分區,更新為 24 個分區。

mysql> alter table clients add partition partitions 18;
Query OK, 0 rows affected (3.33 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table clients; //查看結果
+----------+---------------------------------------------------------|
|Table     | Create Table
+----------+---------------------------------------------------------|
clients2 | CREATE TABLE `clients` (
 `id` int(11) DEFAULT NULL,
 `fname` VARCHAR(30) DEFAULT NULL,
 `lname` VARCHAR(30) DEFAULT NULL,
 `signed` date DEFAULT NULL
) /*!50100 PARTITION BY HASH ( MONTH(signed))
    PARTITIONS 24 */ |
+----------+---------------------------------------------------------1
row in set (0.00 sec)

注釋:“ALTER TABLE ... REORGANIZE PARTITION”不能用於按照HASH或HASH分區的表。

最後更新:2016-11-24 11:23:47

  上一篇:go NULL值處理__分區_SQL語法參考_雲數據庫 OceanBase-阿裏雲
  下一篇:go 數值類型__數據類型_SQL語法參考_雲數據庫 OceanBase-阿裏雲