2012-08-10 14 views
11

我試着用範圍分區創建一個表。但它顯示了以下錯誤:主服務器必須包含表的分區位置錯誤中的所有列?

A primary must include all columns in the table's partitioning location.

這是我的SQL語句:

CREATE TABLE `tbl_emp_confirmation` (
    `fld_id` int(11) NOT NULL AUTO_INCREMENT, 
    `fldemp_id` varchar(100) DEFAULT NULL, 
    `fldempname` varchar(100) DEFAULT NULL, 
    `fldjoindate` varchar(100) DEFAULT NULL, 
    `fldconfirmdate` Date NOT NULL, 
    `fldresigndate` varchar(100) DEFAULT NULL, 
    `fldstatus` varchar(50) DEFAULT NULL, 
    `fldcon_status` varchar(100) DEFAULT NULL, 
    UNIQUE KEY `fld_id` (`fld_id`), 
    KEY `in_empconfirmation` (`fldemp_id`,`fldempname`,`fldjoindate`,`fldconfirmdate`) 
) PARTITION BY RANGE (Month(fldconfirmdate)) 
    (PARTITION p_JAN VALUES LESS THAN (TO_DAYS('2011-01-01')), 
PARTITION p_FEB VALUES LESS THAN (TO_DAYS('2011-02-01')), 
PARTITION p_MAR VALUES LESS THAN (TO_DAYS('2011-03-01')), 
PARTITION p_APR VALUES LESS THAN (TO_DAYS('2011-04-01')), 
PARTITION p_MAY VALUES LESS THAN (TO_DAYS('2011-05-01')), 
PARTITION p_MAX VALUES LESS THAN MAXVALUE); 

回答

14

您正在使用fldconfirmdate分區數據,這是你PK的一部分,但不是你的UNIQUE KEY fld_id的一部分。

這是從MySQL manual提取:

In other words, every unique key on the table must use every column in the table's partitioning expression.

這意味着,在作出fldconfirmdate是你唯一鍵「fld_id'會解決這個問題的一部分。

CREATE TABLE `tbl_emp_confirmation` (
    `fld_id` int(11) NOT NULL AUTO_INCREMENT, 
    `fldemp_id` varchar(100) DEFAULT NULL, 
    `fldempname` varchar(100) DEFAULT NULL, 
    `fldjoindate` varchar(100) DEFAULT NULL, 
    `fldconfirmdate` Date NOT NULL, 
    `fldresigndate` varchar(100) DEFAULT NULL, 
    `fldstatus` varchar(50) DEFAULT NULL, 
    `fldcon_status` varchar(100) DEFAULT NULL, 
    UNIQUE KEY `fld_id` (`fld_id`, `fldconfirmdate`), 
    KEY `in_empconfirmation` (`fldemp_id`,`fldempname`,`fldjoindate`,`fldconfirmdate`) 
) PARTITION BY RANGE (Month(fldconfirmdate)) 
    (PARTITION p_JAN VALUES LESS THAN (TO_DAYS('2011-01-01')), 
PARTITION p_FEB VALUES LESS THAN (TO_DAYS('2011-02-01')), 
PARTITION p_MAR VALUES LESS THAN (TO_DAYS('2011-03-01')), 
PARTITION p_APR VALUES LESS THAN (TO_DAYS('2011-04-01')), 
PARTITION p_MAY VALUES LESS THAN (TO_DAYS('2011-05-01')), 
PARTITION p_MAX VALUES LESS THAN MAXVALUE); 
+0

謝謝@jmoro我發現成功實施。 – Dhileepan 2012-08-10 07:27:18

+0

絕妙的主意;我沒有使用複雜的PRIMARY鍵,但認爲我們的數據庫可以真正使用一些分區!謝謝你的想法 – veeTrain 2014-02-20 14:54:07

相關問題