mysql(5.6)分区(一)分区键,主键和唯一键
来源:互联网 发布:java的反射机制详解 编辑:程序博客网 时间:2024/05/18 08:43
本节讨论分区键与主键和唯一键的关系。管理此关系的规则可以表示如下:分区表的分区表达式中使用的所有列必须是表可能具有的每个唯一键的一部分。
换句话说,表上的每个唯一键都必须使用表的分区表达式中的每一列。(这也包括表的主键,因为根据定义是一个唯一的键,这个特定的情况在本节稍后讨论。)例如,以下每个表创建语句都是无效的:
CREATE TABLE t1 ( col1 INT NOT NULL, col2 DATE NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL, UNIQUE KEY (col1, col2))PARTITION BY HASH(col3)PARTITIONS 4;CREATE TABLE t2 ( col1 INT NOT NULL, col2 DATE NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL, UNIQUE KEY (col1), UNIQUE KEY (col3))PARTITION BY HASH(col1 + col3)PARTITIONS 4;
在每种情况下,所提出的表将至少包含一个不包括分区表达式中使用的所有列的唯一键。
以下每个语句都是有效的,并且表示可以使相应的无效表创建语句工作的一种方式:
CREATE TABLE t1 ( col1 INT NOT NULL, col2 DATE NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL, UNIQUE KEY (col1, col2, col3))PARTITION BY HASH(col3)PARTITIONS 4;CREATE TABLE t2 ( col1 INT NOT NULL, col2 DATE NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL, UNIQUE KEY (col1, col3))PARTITION BY HASH(col1 + col3)PARTITIONS 4;
此示例显示在这种情况下产生的错误:
mysql> CREATE TABLE t3 ( -> col1 INT NOT NULL, -> col2 DATE NOT NULL, -> col3 INT NOT NULL, -> col4 INT NOT NULL, -> UNIQUE KEY (col1, col2), -> UNIQUE KEY (col3) -> ) -> PARTITION BY HASH(col1 + col3) -> PARTITIONS 4;ERROR 1491 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function
该CREATE TABLE
语句失败,因为两者col1
并col3
包含在建议分区键,但是没有这些列既是餐桌上唯一键的一部分。这显示了无效表定义的一个可能的修复:
mysql> CREATE TABLE t3 ( -> col1 INT NOT NULL, -> col2 DATE NOT NULL, -> col3 INT NOT NULL, -> col4 INT NOT NULL, -> UNIQUE KEY (col1, col2, col3), -> UNIQUE KEY (col3) -> ) -> PARTITION BY HASH(col3) -> PARTITIONS 4;Query OK, 0 rows affected (0.05 sec)
在这种情况下,所提出的分区键 col3
是唯一键的一部分,表创建语句成功。
下表不能完全分区,因为没有办法在分区键中包含属于两个唯一键的任何列:
CREATE TABLE t4 ( col1 INT NOT NULL, col2 INT NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL, UNIQUE KEY (col1, col3), UNIQUE KEY (col2, col4));
由于每个主键都是一个唯一的键,所以这个限制还包括表的主键(如果有的话)。例如,接下来的两个语句是无效的:
CREATE TABLE t5 ( col1 INT NOT NULL, col2 DATE NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL, PRIMARY KEY(col1, col2))PARTITION BY HASH(col3)PARTITIONS 4;CREATE TABLE t6 ( col1 INT NOT NULL, col2 DATE NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL, PRIMARY KEY(col1, col3), UNIQUE KEY(col2))PARTITION BY HASH( YEAR(col2) )PARTITIONS 4;
在这两种情况下,主键不包括分区表达式中引用的所有列。但是,接下来的两个语句都是有效的:
CREATE TABLE t7 ( col1 INT NOT NULL, col2 DATE NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL, PRIMARY KEY(col1, col2))PARTITION BY HASH(col1 + YEAR(col2))PARTITIONS 4;CREATE TABLE t8 ( col1 INT NOT NULL, col2 DATE NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL, PRIMARY KEY(col1, col2, col4), UNIQUE KEY(col2, col1))PARTITION BY HASH(col1 + YEAR(col2))PARTITIONS 4;
如果一个表没有唯一的键 - 这包括没有主键 - 那么这个限制不适用,只要列类型与分区类型兼容,你可以使用分区表达式中的任何列或列。
出于同样的原因,您不能在分区表中添加唯一键,除非键包含表的分区表达式使用的所有列。考虑如下所示创建的分区表:
mysql> CREATE TABLE t_no_pk (c1 INT, c2 INT) -> PARTITION BY RANGE(c1) ( -> PARTITION p0 VALUES LESS THAN (10), -> PARTITION p1 VALUES LESS THAN (20), -> PARTITION p2 VALUES LESS THAN (30), -> PARTITION p3 VALUES LESS THAN (40) -> );Query OK, 0 rows affected (0.12 sec)
可以t_no_pk
使用以下任一 ALTER TABLE
语句添加主键 :
# possible PKmysql> ALTER TABLE t_no_pk ADD PRIMARY KEY(c1);Query OK, 0 rows affected (0.13 sec)Records: 0 Duplicates: 0 Warnings: 0# drop this PKmysql> ALTER TABLE t_no_pk DROP PRIMARY KEY;Query OK, 0 rows affected (0.10 sec)Records: 0 Duplicates: 0 Warnings: 0# use another possible PKmysql> ALTER TABLE t_no_pk ADD PRIMARY KEY(c1, c2);Query OK, 0 rows affected (0.12 sec)Records: 0 Duplicates: 0 Warnings: 0# drop this PKmysql> ALTER TABLE t_no_pk DROP PRIMARY KEY;Query OK, 0 rows affected (0.09 sec)Records: 0 Duplicates: 0 Warnings: 0
但是,下一条语句失败,因为c1
是分区键的一部分,但不是提出的主键的一部分:
# fails with error 1503mysql> ALTER TABLE t_no_pk ADD PRIMARY KEY(c2);ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function
由于t_no_pk
只有c1
其分区表达式,尝试c2
单独添加唯一的键失败。但是,您可以添加使用两个独特的键c1
和 c2
。
这些规则也适用于您希望使用分区的现有非分区表 ALTER TABLE ... PARTITION BY
。考虑np_pk
如下所示创建的表 :
mysql> CREATE TABLE np_pk ( -> id INT NOT NULL AUTO_INCREMENT, -> name VARCHAR(50), -> added DATE, -> PRIMARY KEY (id) -> );Query OK, 0 rows affected (0.08 sec)
以下 ALTER TABLE
语句失败并出现错误,因为该 added
列不是表中任何唯一键的一部分:
mysql> ALTER TABLE np_pk -> PARTITION BY HASH( TO_DAYS(added) ) -> PARTITIONS 4;ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function
但是,这个使用id
分区列列的语句是有效的,如下所示:
mysql> ALTER TABLE np_pk -> PARTITION BY HASH(id) -> PARTITIONS 4;Query OK, 0 rows affected (0.11 sec)Records: 0 Duplicates: 0 Warnings: 0
在这种情况下np_pk
,可以用作分区表达式的一部分的唯一列是 id
; 如果您希望使用分区表达式中的任何其他列或列对该表进行分区,则必须先修改表,方法是将所需的列或列添加到主键,或者通过完全删除主键。
- mysql(5.6)分区(一)分区键,主键和唯一键
- MySQL Study之--分区键和唯一性索引及主键之关系
- 19.6.1 Partitioning Keys, Primary Keys, and Unique Keys 分区键,主键,和唯一健
- mysql 创建分区表注意事项,每一个唯一约束必须包含在Mysql分区表的分区键(也包括主键约束)。
- 为什么主键分区必须加分区键?
- DB2 SQL0613N 标识的主键、唯一键或表分区键太长或者包含太多的列和时间段。
- mysql(5.6)分区(四)分区和锁定
- 主键 和 唯一键(唯一约束)
- MySQL常用分区方式及分区主键的添加
- mysql垂直分区和水平分区
- MySQL的垂直分区和水平分区
- mysql垂直分区和水平分区
- mysql垂直分区和水平分区
- Oracle10g分区和Mysql分区区别
- Mysql垂直分区和水平分区
- powerdesigner设置mysql唯一键,非主键
- mysql主键唯一键重复插入解决方法
- sql学习一 主键,联合主键,外键、索引 ,分区
- 【字符串·ac自动机】uva1449Dominating Patterns
- 机器学习入门-线性回归
- Linux启动/停止/重启XAMPP(禅道)
- 集合
- perl_正则表达式
- mysql(5.6)分区(一)分区键,主键和唯一键
- 网站开发(一)环境配置及模板准备
- mysql 数据引擎
- 完美解决Python2操作中文名文件乱码的问题
- Codeforces
- 矩形覆盖(剑指Offer)
- for循环、forEach、map、filter区别及效率分析
- ES6 --- let
- 上传图片到服务器,服务器保存并且接收到了,但是必须刷新文件夹或者重新部署文件才能在客户端显示图片