CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY RANGE ( datediff(separated,now()) ) (
    PARTITION p0 VALUES LESS THAN 45,
    PARTITION p1 VALUES LESS THAN 800,
    PARTITION p2 VALUES LESS THAN 2001,
    PARTITION p3 VALUES LESS THAN MAXVALUE
);提示错误:ERROR 1064 (42000): Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed near ') (
    PARTITION p0 VALUES LESS THAN 45,
    PARTITION p1 VALUES LESS THAN 800,' at line 10什么原因?

解决方案 »

  1.   

    已经提示:
    ERROR 1064 (42000): Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed near '修改
    datediff(separated,now())
      

  2.   


    不支持datediff? 我看5.6 已经support datediff 了,还是我的语法有问题?谢谢
      

  3.   

    now()
    不要用这个,换个固定的值。
      

  4.   

    mysql>  CREATE TABLE employees (
        ->     id INT NOT NULL,
        ->     fname VARCHAR(30),
        ->     lname VARCHAR(30),
        ->     hired DATE NOT NULL DEFAULT '1970-01-01',
        ->     separated DATE NOT NULL DEFAULT '9999-12-31',
        ->     job_code INT,
        ->     store_id INT
        -> )
        -> PARTITION BY RANGE ( datediff(separated,'2013-01-01') ) (
        ->     PARTITION p0 VALUES LESS THAN 45,
        ->     PARTITION p1 VALUES LESS THAN 800,
        ->     PARTITION p2 VALUES LESS THAN 2001,
        ->     PARTITION p3 VALUES LESS THAN MAXVALUE
        -> );
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '45,
        PARTITION p1 VALUES LESS THAN 800,
        PARTITION p2 VALUES LESS THAN 200' at line 11
    报别的错误,其实我的目的就是创建一个分区表,p1 保留最近45 天的数据,超过45天自动到p2..
      

  5.   

    动态分区啊  没这么干的吧这表结构一个索引没有  建个separated 索引比分区靠谱多了
      

  6.   


    索引肯定会有的,这么考虑主要是因为比较分区和分表的差别,如果分区能够实现这个动态分区,这样引用程序修改会少一些,如果用分表的方式,有一些报表可能需要union 来完成,以前的方式是采用分表,
    不知道分区的效果如何,我看5.6 已经支持range datediff 分区了,但我测试半天也创建不成功,相当郁闷啊。
      

  7.   

    增加ADATE字段,保存datediff(separated,now()),再建立分区
    CREATE TABLE employees (
        id INT NOT NULL,
        fname VARCHAR(30),
        lname VARCHAR(30),
        hired DATE NOT NULL DEFAULT '1970-01-01',
        separated DATE NOT NULL DEFAULT '9999-12-31',
        job_code INT,
        store_id INT,
        adate INT )
        PARTITION BY RANGE (adate) (
        PARTITION p0 VALUES LESS THAN (45),
        PARTITION p1 VALUES LESS THAN (800),
        PARTITION p2 VALUES LESS THAN (2001),
        PARTITION p3 VALUES LESS THAN MAXVALUE
    );
      

  8.   

    check the manual that corresponds to your MySQL server version for the right syntax to use near '45,
        PARTITION p1 VALUES LESS THAN 800,
        PARTITION p2 VALUES LESS THAN 200' at line 11类似语法错误其实首先应该做的是到MYSQL官方提供的免费手册中看一下例子中的语法,这个操作也就需要2分钟。PARTITION BY RANGE (store_id) (
        PARTITION p0 VALUES LESS THAN (6),
        PARTITION p1 VALUES LESS THAN (11),
        PARTITION p2 VALUES LESS THAN (16),
        PARTITION p3 VALUES LESS THAN (21)
    );
    你的()哪去了?
      

  9.   

    报别的错误,其实我的目的就是创建一个分区表,p1 保留最近45 天的数据,超过45天自动到p2..这个要求不现实!
    分区仅是在插入记录或者UPDATE这个记录时,MYSQL会根据规则把记录插入或者UPDATE到对应分区, 而如果没有变化,则记录永远是保留在它的那个分区。而你每天插入的记录如果都是当天的,则所有记录会都被插入到p0 VALUES LESS THAN 45分区。不会到第50天某条记录会被自动移到P1分区。这种分区在实际中结果是没有任何意义。