2012-08-24 118 views
0

我需要按照以下格式創建表。但是返回分區區域的錯誤是Error Code: 1659. Field 'fldassigndate' is of a not allowed type for this type of partitioning。如何解決此錯誤並進行分區?MySQL分區錯誤

CREATE TABLE tblattendancesetup (
    fldattendanceid int(11) NOT NULL AUTO_INCREMENT, 
    flddept varchar(100) DEFAULT NULL, 
    fldemployee varchar(100) DEFAULT NULL, 
    fldintime varchar(20) DEFAULT NULL, 
    fldouttime varchar(20) DEFAULT NULL, 
    fldlateafter varchar(20) DEFAULT NULL, 
    fldearlybefore varchar(20) DEFAULT NULL, 
    fldweekoff varchar(20) DEFAULT NULL, 
    fldshiftname varchar(20) DEFAULT NULL, 
    fldassigndate varchar(20) DEFAULT NULL, 
    fldfromdate varchar(20) DEFAULT NULL, 
    fldtodate varchar(20) DEFAULT NULL, 
    fldrefid varchar(20) DEFAULT NULL, 
    UNIQUE KEY fldattendanceid (fldattendanceid), 
    KEY in_attendancesetup (fldemployee,fldintime,fldouttime,fldlateafter,fldearlybefore,fldfromdate,fldtodate,fldattendanceid), 
    KEY i_emp_tmp (fldemployee), 
    KEY i_emp_attendance (fldemployee) 
) 
PARTITION BY RANGE (fldassigndate) 
(PARTITION p_Apr VALUES LESS THAN (TO_DAYS('2012-05-01')), 
PARTITION p_May VALUES LESS THAN (TO_DAYS('2012-06-01')), 
PARTITION p_Nov VALUES LESS THAN MAXVALUE); 
+0

爲什麼你所有的日期列VARCHAR(20)? 'MAXVALUE'對於可以存儲任意文本的字段意味着什麼? –

+0

你研究過了嗎?通過簡單的搜索就可以輕鬆找到答案。 –

回答

3

從MySQL手冊(第18節):分區鍵的

數據類型。分區鍵必須是 整數列或解析爲整數的表達式。

既不日期也不VARCHAR處理,可以用於分割

+0

我已將數據類型更改爲「日期」。將該列添加到唯一鍵和to_days函數。所以。它工作正常。但。我懷疑,如果該列的數據類型是varchar,分區將如何工作? – Dhileepan

1

雖然這個問題很老了,我還以爲它會幫助那些搜索,好像我是在一個點上。

OP應該首先使用日期字段的正確結構(如日期時間)正確設置其列結構。

一旦完成,我還沒有試圖以這種方式設置我的密鑰,但我發現如果我想保持我的表結構相同,我需要使用複合主鍵。在這種情況下,它會是

PRIMARY KEY(`fldattendanceid`, `fldassigndate`) 

然後,有在PARTITION BY RANGE指定缺少TO_DAYS。最後,我不是100%確定的,但我認爲你不能在空字段分區。即使你可以,這樣做也是非常糟糕的做法。

CREATE TABLE tblattendancesetup (
    fldattendanceid INT(11) NOT NULL AUTO_INCREMENT, 
    flddept VARCHAR(100) DEFAULT NULL, 
    fldemployee VARCHAR(100) DEFAULT NULL, 
    fldintime DATETIME DEFAULT NULL, 
    fldouttime DATETIME DEFAULT NULL, 
    fldlateafter DATETIME DEFAULT NULL, 
    fldearlybefore DATETIME DEFAULT NULL, 
    fldweekoff VARCHAR(20) DEFAULT NULL, 
    fldshiftname VARCHAR(20) DEFAULT NULL, 
    fldassigndate DATETIME NOT NULL, 
    fldfromdate DATETIME DEFAULT NULL, 
    fldtodate DATETIME DEFAULT NULL, 
    fldrefid VARCHAR(20) DEFAULT NULL, 
    PRIMARY KEY(`fldattendanceid`, `fldassigndate`), 
    KEY in_attendancesetup  (fldemployee,fldintime,fldouttime,fldlateafter,fldearlybefore,fldfromdate,fldtodate,fldattendanceid), 
    KEY i_emp_tmp (fldemployee), 
    KEY i_emp_attendance (fldemployee) 
) 
PARTITION BY RANGE (TO_DAYS(fldassigndate)) 
(PARTITION p_Apr VALUES LESS THAN (TO_DAYS('2012-05-01')), 
PARTITION p_May VALUES LESS THAN (TO_DAYS('2012-06-01')), 
PARTITION p_Nov VALUES LESS THAN MAXVALUE); 

我希望這可以幫助別人!