Я бы хотел разбить существующую таблицу на 3 раздела. Во время обновления нашего решения скрипт powershell подключится к серверу MySQL и выполнит файл сценария.
Я попробовал следующий запрос для добавления разделов:
Alter Table 'mytable'
PARTITION BY RANGE (TO_DAYS('TimeStart'))
(
PARTITION start VALUES LESS THAN (0),
PARTITION "from"+(curdate()+0) VALUES LESS THAN (curdate()+1),
PARTITION future VALUES LESS THAN MAXVALUE
);
column timestart
(datetime(3) NOT NULL
) является частью первичного ключа.
Раздел в середине требует определенных значений, чтобы сделать его совместимым с запросами на обслуживание, выполняемыми с помощью службы Windows с некоторым интервалом.
Запрос не выполняется по двум причинам:
Создание имени раздела: Я хотел бы получить, например, "from20180220", когда скрипт был выполнен сегодня. Сообщение об ошибке
Код ошибки: 1064. У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '' from "+ (curdate() +0). ЦЕННОСТИ МЕНЬШЕ (curdate() +1), PARTITION future 'в строке 5
Создание значения раздела. Когда скрипт запускается сегодня (19 февраля), я хотел бы иметь эквивалент VALUES LESS THAN (TO_DAYS('2018-2-20')
.
Код ошибки: 1064. Постоянные, случайные или зависящие от времени выражения в функции (под) разделения не допускаются вблизи '), PARTITION future VALUES LESS THAN MAXVALUE)' в строке 5
Я попробовал TO_DAYS(curdate())+1
. На самом деле, я не ожидал, что MySQL будет иметь закрытие...
Как можно решить эти ошибки?
Вы пытаетесь использовать MySQL-функции манипуляции с данными, такие как CURDATE()
и TO_DAYS()
в коде определения данных. Вы не можете этого сделать.
Вам нужно написать какую-то программу для записи небольшого файла, содержащего команду Alter Table
, а затем запустить этот файл в MySQL.
Объяснения от O.Jones немного коротки.
Вам нужно использовать скрипт другого языка, например php, perl, python...
Тогда напишите что-то вроде работы:
Alter Table 'mytable'
PARTITION BY RANGE (TO_DAYS('TimeStart'))
(
PARTITION start VALUES LESS THAN (0),
PARTITION from".$curdate." VALUES LESS THAN TO_DAYS(".$nextdateTime."),
PARTITION future VALUES LESS THAN MAXVALUE
);