Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql分区中的错误_Mysql_Database_Database Partitioning - Fatal编程技术网

mysql分区中的错误

mysql分区中的错误,mysql,database,database-partitioning,Mysql,Database,Database Partitioning,我需要创建以下格式的表。但是正在返回分区区域中的错误,即错误代码:1659。字段“fldassigndate”是此类型分区不允许使用的类型。如何解决此错误并进行分区 CREATE TABLE tblattendancesetup ( fldattendanceid int(11) NOT NULL AUTO_INCREMENT, flddept varchar(100) DEFAULT NULL, fldemployee varchar(100) DEFAULT NULL, fl

我需要创建以下格式的表。但是正在返回分区区域中的错误,即
错误代码:1659。字段“fldassigndate”是此类型分区不允许使用的类型
。如何解决此错误并进行分区

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 );
从MySQL手册(第18节)中:

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

日期和varchar都不能用于MySQL手册(第18节)中的分区:

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


Date和varchars都不能用于分区

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

OP应该首先通过对日期字段使用正确的结构(如datetime)来正确设置其列结构

一旦这样做了,我就不再尝试以这种方式设置键,但是我发现如果我想保持表的结构不变,我需要使用复合主键。在这种情况下,应该是

PRIMARY KEY(`fldattendanceid`, `fldassigndate`)
然后,在分区按范围中指定了缺少的到_天。最后,我不是百分之百确定,但我认为不能在空字段上进行分区。即使你可以,这样做也是一种可怕的做法

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

我希望这对别人有帮助

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

OP应该首先通过对日期字段使用正确的结构(如datetime)来正确设置其列结构

一旦这样做了,我就不再尝试以这种方式设置键,但是我发现如果我想保持表的结构不变,我需要使用复合主键。在这种情况下,应该是

PRIMARY KEY(`fldattendanceid`, `fldassigndate`)
然后,在分区按范围中指定了缺少的到_天。最后,我不是百分之百确定,但我认为不能在空字段上进行分区。即使你可以,这样做也是一种可怕的做法

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

我希望这对别人有帮助

为什么所有的日期列都是VARCHAR(20)?对于可以存储任意文本的字段,
MAXVALUE
意味着什么?您研究过这个吗?答案很容易通过简单的搜索找到。为什么所有的日期列都是VARCHAR(20)?对于可以存储任意文本的字段,
MAXVALUE
意味着什么?您研究过这个吗?答案很容易通过简单的搜索找到。我将数据类型更改为
date
。将该列添加到unique key和_days函数中。所以它工作得很好。但是我怀疑如果该列的数据类型为varchar,分区将如何工作?我将数据类型更改为
date
。将该列添加到unique key和_days函数中。所以它工作得很好。但是我怀疑如果该列的数据类型是varchar,分区将如何工作?