【问题标题】:A primary must include all columns in the table's partitioning location error?主必须包括表的分区位置错误中的所有列?
【发布时间】:2016-08-23 23:30:35
【问题描述】:

我尝试使用范围分区创建表。但它显示以下错误:

主数据库必须包含表分区中的所有列 位置。

这是我的 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 );

【问题讨论】:

    标签: mysql database


    【解决方案1】:

    您正在使用 fldconfirmdate 对数据进行分区,它是您的 PK 的一部分,但不是您的 UNIQUE KEY fld_id 的一部分。

    这是从MySQL manual中提取的:

    换句话说,表上的每个唯一键都必须使用表分区表达式中的每一列。

    这意味着,将 fldconfirmdate 设置为 UNIQUE KEY '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 );
    

    【讨论】:

    • 谢谢@jmoro 我发现成功实现了。
    • 好主意;我没有使用复杂的 PRIMARY 键,但认为我们的数据库真的可以使用一些分区!谢谢你的想法
    • 如果你已经有一个主键,你可以创建一个复合主键来让轮子运转起来。
    猜你喜欢
    • 2018-09-09
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    相关资源
    最近更新 更多