, поэтому я впервые пытаюсь разбивать разделы в mysql, любая помощь будет очень оценена. То, что я хочу, чтобы раздел, чтобы сделать, это получить, прежде чем меньше Cur даты для раздела 1, на следующей неделе в разделе 2 и максимальное значение для раздела 3.Первые попытки разделения диапазона в mysql
create TABLE diagnostics_daily_device_summary (
ID bigint(20) NOT NULL AUTO_INCREMENT,
timestamp datetime,
- есть и другие поля, включенные но ради пример я не надоест бросать их в
PRIMARY KEY (ID, timestamp)
)
PARTITION BY RANGE (yearweek(timestamp))(
PARTITION p1 VALUES LESS THAN (yearweek(curdate())),
PARTITION p2 VALUES LESS THAN (yearweek(date_add(curdate(), interval 7 day))),
PARTITION p3 VALUES LESS THAN maxvalue
);
мне нужно сохранить последние 3 недели данных, поэтому я разбить его на yearweek формат.
Когда я запускаю запрос сообщение об ошибке я получаю это
КодОшибка: 1064. Константа, случайная или временная зона, зависящие от выражения в (суб) функции разбиения не подпускают «), PARTITION p201547 ЗНАЧЕНИЯ МЕНЕЕ (yearweek (DATE_ADD (CURDATE(), интервал 7 d»в строке 70
Я не слишком уверен, как это исправить.
Кроме того, я хочу, чтобы добавить новую неделю каждую неделю, и падение на прошлой неделе я получил эту строку кода из онлайн-источника
USE demotimeparts;
DROP PROCEDURE IF EXISTS rotateTimePartition;
DELIMITER //
CREATE PROCEDURE rotateTimePartition (newPartValue DATETIME)
BEGIN
DECLARE keepStmt VARCHAR(2000) default @stms;
DECLARE partitionToDrop VARCHAR(64);
SELECT 201501
INTO partitionToDrop
-- FROM SCHEMA_NAME.partitions
WHERE table_schema='SCHEMA_NAME'
AND tabe_name='diagnostics_daily_device_summary'
AND partition_ordinary_position=1;
SET @stmt = CONCAT ('ALTER TABLE diagnostics_daily_device_summary DROP PARTITION' , partitionToDrop);
PREPARE pStmt FROM @stmt;
EXECUTE pStmt;
DEALLOCATE PREPARE pStmt;
SET @stmt = CONCAT ('ALTER TABLE diagnostics_daily_device_summary ADD PARTITION (PARTITION Y',
DATE_FORMAT(newPartValue, '%Y%m%d'),
' VALUES LESS THAN (TO_DAYS(\'',
DATE_FORMAT(newPartValue, '%Y-%m-%d'),
'\')))');
PREPARE pStmt FROM @stmt;
EXECUTE pStmt;
DEALLOCATE PREPARE pStmt;
SET @stmt = keepStmt;
END //
DELIMITER;
Как я уже сказал, любая помощь будет принята с благодарностью! еще раз спасибо.