【问题标题】:error in mysql partitioningmysql分区错误
【发布时间】:2012-08-24 05:07:59
【问题描述】:

我需要按以下格式创建表格。但是在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 );

【问题讨论】:

  • 为什么你所有的日期列都是 VARCHAR(20)? MAXVALUE 对可以存储任意文本的字段意味着什么?
  • 你研究过这个吗?只需简单搜索即可轻松找到答案。

标签: mysql database database-partitioning


【解决方案1】:

来自 MySQL 手册(第 18 节):

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

日期和 varchar 都不能用于分区

【讨论】:

  • 我已将数据类型更改为date。将该列添加到唯一键和 to_days 函数。所以。它工作正常。但。我怀疑如果该列的数据类型为 varchar ,分区将如何工作?
【解决方案2】:

虽然这个问题已经很老了,但我认为它会帮助那些搜索,就像我曾经做过的那样。

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

我希望这对某人有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 2015-12-25
    • 1970-01-01
    • 2014-03-03
    • 2023-04-10
    • 2013-09-20
    • 1970-01-01
    相关资源
    最近更新 更多