通过对分区知识的学习,终于展开实践,可是发现出师不利,对于别人提供的例子复制改改发现出现了问题。

  别人的例子:

     CREATE TABLE employee(id INT NOT NULL,
fname VARCHAR(30),Iname VARCHAR(30),job_code INT NOT NULL,
store_id INT NOT )PARTITION BY RANGE (store_id)(
PARTITION p0 VALUES LESS THAN (2),PARTITION p1 VALUES LESS THAN (3),
PARTITION p2 VALUES LESS THAN MAXVALUE);

我的sql语句:

CREATE TABLE `tb_famenshidu2` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `famenid` INT(11) ,
  `shidu` VARCHAR(30) ,
  `time` DATETIME ,
  `flag` VARCHAR(2) ,
  PRIMARY KEY (`id`)
)PARTITION BY RANGE (famenid)(
PARTITION p0 VALUES LESS THAN (2),PARTITION p1 VALUES LESS THAN (3),
PARTITION p2 VALUES LESS THAN MAXVALUE);

报错:A primary key must include all columns in the table's partitioning function

也就是报错说 你的分区字段不包括主键,查看mysql手册有了更深的认识:

18.5.1. Partitioning Keys, Primary Keys, and Unique Keys
This section discusses the relationship of partitioning keys with primary keys and unique keys. The rule governing this relationship can be expressed as follows: All columns used in the partitioning expression for a partitioned table must be part of every unique key that the table may have. 
 
In other words,every unique key on the table must use every columnin the table's partitioning expression. (This also includes the table's primary key, since it is by definition a unique key. This particular case is discussed later in this section.) For example, each of the following table creation statements is invalid: 
也就说分区字段中有主键或者唯一索引的列,那么所有主键列和唯一索引列都必须包含进来,对于为什么这样解决,引用别人的说法:为了确保主键的效率。否则同一主键区的东西一个在A分区,一个在B分区,显然会比较麻烦。

解决一:发现别人的例子,没有主键的,所以我也尝试这样解决:

CREATE TABLE `tb_famenshidu1` (
  `id` INT(40) NOT NULL AUTO_INCREMENT,
  `famenid` INT(11) NOT NULL,
  `shidu` VARCHAR(30) DEFAULT NULL,
  `time` DATETIME DEFAULT NULL,
  `flag` VARCHAR(2) DEFAULT NULL,
  KEY `id` (`id`)
) ENGINE=INNODB AUTO_INCREMENT=84389 DEFAULT CHARSET=gbk
 PARTITION BY RANGE (famenid)
(PARTITION p0 VALUES LESS THAN (2) ENGINE = INNODB,
 PARTITION p1 VALUES LESS THAN (3) ENGINE = INNODB,
 PARTITION p2 VALUES LESS THAN (4) ENGINE = INNODB,
 PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = INNODB ) ;

我用jdbc向数据库插入数据发现正常,修改hibernate的配置,去除主键映射后发现,提取信息也是正确的,所以在不影响功能的前天下去掉主键为一种方法吧。

查看分区 

 SELECT 
  partition_name part,  
  partition_expression expr,  
  partition_description descr,  
  table_rows  
FROM information_schema.partitions  WHERE 
  table_schema = SCHEMA()  
  AND table_name='tb_famenshidu1'; 



解决二:复合键

顺应MYSQL的要求,就把分区字段加入到主键中,组成复合主键
CREATE TABLE T1 (
     id int(8) NOT NULL AUTO_INCREMENT,
     createtime datetime NOT NULL,
      PRIMARY KEY (id,createtime)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
PARTITION BY RANGE(TO_DAYS (createtime))
(
PARTITION p0 VALUES LESS THAN (TO_DAYS('2010-04-15')),
PARTITION p1 VALUES LESS THAN (TO_DAYS('2010-05-01')),
PARTITION p2 VALUES LESS THAN (TO_DAYS('2010-05-15')),
PARTITION p3 VALUES LESS THAN (TO_DAYS('2010-05-31')),
PARTITION p4 VALUES LESS THAN (TO_DAYS('2010-06-15')),
PARTITION p19 VALUES LESS ThAN  MAXVALUE);
 测试通过,分区成功。


Logo

更多推荐