У меня есть секционированная таблица, в которую я вставляю данные из хранимой процедуры,
У меня есть секционирование в таблице по столбцу с именем year
,
Хранимая процедура может вставлять данные вправильно разделить таблицу.
Но теперь у меня есть случай, когда могут произойти вставки, для которых разделы могут отсутствовать,
Мне нужно решение, чтобы найти, существует ли конкретное имя раздела длятаблица.
Например.Моя таблица имеет имя backups
У меня есть 3 раздела на данный момент -
2018, 2019 и 2020
Но в 2021 году, в котором выполняется хранимая процедура,
может не быть раздела длягод
Поэтому я хочу, чтобы моя хранимая процедура обрабатывала проверку и создание раздела во время выполнения.
Ниже приведена структура моей таблицы -
![enter image description here](https://i.stack.imgur.com/wh6jR.png)
Запрос на создание раздела -
ALTER TABLE backups
partition by list columns(year)
(partition backup_2018 values IN (2018),
partition backup_2019 values IN (2019),
partition backup_2020 values IN (2020));
Следующая моя хранимая процедура -
CREATE DEFINER=`root`@`localhost` PROCEDURE `daily_backup`()
BEGIN
DECLARE backuptime INT;
#Need Partition checking and creation here
SET backuptime = UNIX_TIMESTAMP(CONCAT(DATE_SUB(DATE_FORMAT(NOW(),'%Y-%m-%d'), INTERVAL 1 DAY),' 23:59:59'));
INSERT into backups
(user_id, latest_transaction_id, balance, last_transaction_timestamp, last_transaction_date, snapshot_date, year)
SELECT
T2.user_id,
T2.transaction_id AS latest_transaction_id,
T2.new_balance AS balance,
T2.created_date AS last_transaction_timestamp,
DATE_FORMAT(FROM_UNIXTIME(T2.created_date), '%Y-%m-%d %I:%i:%S') AS last_transaction_date,
DATE_FORMAT(NOW(), '%Y-%m-%d') AS snapshot_date,
DATE_FORMAT(NOW(), '%Y') AS year
FROM
(SELECT
user_id, MAX(transaction_id) maxTransID
FROM
transaction
WHERE
created_date < @backuptime
GROUP BY user_id) Tmp
JOIN
transaction T2 ON Tmp.MaxTransID = T2.Transaction_ID;
END