1

我需要以以下格式创建表格。但是正在返回分区区域中的错误,即Error Code: 1659. Field 'fldassigndate' is of a not allowed type for this type of partitioning. 如何解决此错误并进行分区?

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 );
4

2 回答 2

3

从 MySQL 手册(第 18 节):

分区键的数据类型。分区键必须是整数列或解析为整数的表达式。

日期和 varchar 都不能用于分区

于 2012-08-24T05:28:17.903 回答
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 );

我希望这可以帮助别人!

于 2015-07-17T21:06:43.227 回答