#### 24.2.3.2 LIST COLUMNS 分区

MySQL 8.0 支持`列出列`分区。这是一个变种`列表`允许使用多个列作为分区键的分区，以及将整数类型以外的数据类型的列用作分区列；您可以使用字符串类型，[`日期`](datetime.html)， 和[`约会时间`](datetime.html)列。（有关允许的数据类型的更多信息`列`分区列，请参阅[第 24.2.3 节，“列分区”](partitioning-columns.html).)

假设您的企业在 12 个城市拥有客户，出于销售和营销目的，您将其组织为 4 个区域，每个区域 3 个城市，如下表所示：

| 地区 | 城市 |
| --- | --- |
| 1 | Oskarshamn, Högsby, Mönsterås |
| 2 | 维默比、赫尔茨弗雷德、韦斯特维克 |
| 3 | Nässjö, Eksjö, 维特兰达 |
| 4 | Uppvidinge、Alvesta、韦克舍 |

和`列出列`分区，您可以为客户数据创建一个表，根据客户所在城市的名称将一行分配给与这些区域对应的 4 个分区中的任何一个，如下所示：

```
CREATE TABLE customers_1 (
    first_name VARCHAR(25),
    last_name VARCHAR(25),
    street_1 VARCHAR(30),
    street_2 VARCHAR(30),
    city VARCHAR(15),
    renewal DATE
)
PARTITION BY LIST COLUMNS(city) (
    PARTITION pRegion_1 VALUES IN('Oskarshamn', 'Högsby', 'Mönsterås'),
    PARTITION pRegion_2 VALUES IN('Vimmerby', 'Hultsfred', 'Västervik'),
    PARTITION pRegion_3 VALUES IN('Nässjö', 'Eksjö', 'Vetlanda'),
    PARTITION pRegion_4 VALUES IN('Uppvidinge', 'Alvesta', 'Växjo')
);
```

与分区一样`范围列`, 你不需要在`列（）`子句将列值转换为整数。（事实上​​，不允许使用列名以外的表达式`列（）`.)

也可以使用[`日期`](datetime.html)和[`约会时间`](datetime.html)列，如下例所示，它使用与`客户_1`表如前所示，但采用`列出列`基于分区`更新`根据 2010 年 2 月客户帐户计划续订的那一周，将行存储在 4 个分区之一中的列：

```
CREATE TABLE customers_2 (
    first_name VARCHAR(25),
    last_name VARCHAR(25),
    street_1 VARCHAR(30),
    street_2 VARCHAR(30),
    city VARCHAR(15),
    renewal DATE
)
PARTITION BY LIST COLUMNS(renewal) (
    PARTITION pWeek_1 VALUES IN('2010-02-01', '2010-02-02', '2010-02-03',
        '2010-02-04', '2010-02-05', '2010-02-06', '2010-02-07'),
    PARTITION pWeek_2 VALUES IN('2010-02-08', '2010-02-09', '2010-02-10',
        '2010-02-11', '2010-02-12', '2010-02-13', '2010-02-14'),
    PARTITION pWeek_3 VALUES IN('2010-02-15', '2010-02-16', '2010-02-17',
        '2010-02-18', '2010-02-19', '2010-02-20', '2010-02-21'),
    PARTITION pWeek_4 VALUES IN('2010-02-22', '2010-02-23', '2010-02-24',
        '2010-02-25', '2010-02-26', '2010-02-27', '2010-02-28')
);
```

这可行，但如果涉及的日期数量变得非常大，则定义和维护变得很麻烦；在这种情况下，通常更实际的做法是使用`范围`要么`范围列`而是进行分区。在这种情况下，由于我们希望用作分区键的列是[`日期`](datetime.html)列，我们使用`范围列`分区，如下所示：

```
CREATE TABLE customers_3 (
    first_name VARCHAR(25),
    last_name VARCHAR(25),
    street_1 VARCHAR(30),
    street_2 VARCHAR(30),
    city VARCHAR(15),
    renewal DATE
)
PARTITION BY RANGE COLUMNS(renewal) (
    PARTITION pWeek_1 VALUES LESS THAN('2010-02-09'),
    PARTITION pWeek_2 VALUES LESS THAN('2010-02-15'),
    PARTITION pWeek_3 VALUES LESS THAN('2010-02-22'),
    PARTITION pWeek_4 VALUES LESS THAN('2010-03-01')
);
```

看[第 24.2.3.1 节，“RANGE COLUMNS 分区”](partitioning-columns-range.html)， 了解更多信息。

此外（与`范围列`分区），您可以在`列（）`条款。

看[第 13.1.20 节，“CREATE TABLE 语句”](create-table.html), 有关更多信息`按列表列分区（）`句法。
