禁止構建
分區表達式不支持以下幾種構建:
存儲過程,存儲函數,UDFS或者插件
聲明變量或者用戶變量
可以參考分區不支持的SQL函數
算術和邏輯運算符
分區表達式支持+,-,*算術運算,但是不支持DIV和/運算(還存在,可以查看Bug #30188, Bug #33182)。但是,結果必須是整形或者NULL(線性分區鍵除外,想了解更多信息,可以查看分區類型)。
分區表達式不支持位運算:|,&,^,<<,>>,~ .
HANDLER語句
在MySQL 5.7.1之前的分區表不支持HANDLER語句,以后的版本取消了這一限制。
服務器SQL模式
如果要用用戶自定義分區的表的話,需要注意的是,在創建分區表時的SQL模式是不保留的。在服務器SQL模式一章中已經討論過,大多數MySQL函數和運算符的結果可能會根據服務器SQL模式而改變。所以,一旦SQL模式在創建分區表后改變,可能導致這些表的行為發生重大變化,很容易導致數據丟失或者損壞。基于以上原因,強烈建議你在創建分區表后千萬不要修改服務器的SQL模式。
舉個例子來說明下上述情況:
1.錯誤處理
| mysql> CREATE TABLE tn (c1 INT) -> PARTITION BY LIST(1 DIV c1) ( -> PARTITION p0 VALUES IN (NULL), -> PARTITION p1 VALUES IN (1) -> ); Query OK, 0 rows affected (0.05 sec) | 
MySQL默認除以0的結果是NULL,而不是報錯:
| mysql> SELECT @@sql_mode;+------------+| @@sql_mode |+------------+| |+------------+1 row in set (0.00 sec) mysql> INSERT INTO tn VALUES (NULL), (0), (1);Query OK, 3 rows affected (0.00 sec)Records: 3 Duplicates: 0 Warnings: 0 | 
然而如果我們修改SQL模式的話,就會報錯:
| mysql> SET sql_mode='STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO';Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO tn VALUES (NULL), (0), (1);ERROR 1365 (22012): Division by 0 | 
2.表輔助功能
有時候修改SQL模式可能會導致分區表不可用。比如有些表只有在SQL模式為NO_UNSIGNED_SUBTRACTION才發揮作用,比如:
| mysql> SELECT @@sql_mode;+------------+| @@sql_mode |+------------+| |+------------+1 row in set (0.00 sec) mysql> CREATE TABLE tu (c1 BIGINT UNSIGNED) -> PARTITION BY RANGE(c1 - 10) ( -> PARTITION p0 VALUES LESS THAN (-5), -> PARTITION p1 VALUES LESS THAN (0), -> PARTITION p2 VALUES LESS THAN (5), -> PARTITION p3 VALUES LESS THAN (10), -> PARTITION p4 VALUES LESS THAN (MAXVALUE) -> );ERROR 1563 (HY000): Partition constant is out of partition function domain mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION';Query OK, 0 rows affected (0.00 sec) mysql> SELECT @@sql_mode;+-------------------------+| @@sql_mode |+-------------------------+| NO_UNSIGNED_SUBTRACTION |+-------------------------+1 row in set (0.00 sec) mysql> CREATE TABLE tu (c1 BIGINT UNSIGNED) -> PARTITION BY RANGE(c1 - 10) ( -> PARTITION p0 VALUES LESS THAN (-5), -> PARTITION p1 VALUES LESS THAN (0), -> PARTITION p2 VALUES LESS THAN (5), -> PARTITION p3 VALUES LESS THAN (10), -> PARTITION p4 VALUES LESS THAN (MAXVALUE) -> ); Query OK, 0 rows affected (0.05 sec) |