Я пытаюсь выполнить следующий процесс в миграции Laravel:
Создать новую таблицу с именем client_log_partitions
.(СОВЕРШЕНО)
$table->create();
$table->bigIncrements('id')->unique();
$table->bigInteger('client_log_id');
$table->mediumText('partition_data');
$table->timestamps();
- У меня уже есть таблица с именем
client_logs
с данными, хранящимися в столбце bigText()
с именем log_data
. - Каждая строка, которая уже существует в таблице
client_logs
, должна быть разделена каждые 250 КБ (или 250 000 символов, поскольку она должна быть однобайтовой), а затем вставлена в новую таблицу client_log_partitions
как разделы, сссылка на запись client_logs
, к которой она принадлежит.
Я знаю, что смогу достичь этого с помощью $table->postExecute()
, я просто не знаю, что я мог бы использовать для этого.
Как только данные будут перемещены вВ новой таблице мне нужно удалить столбец log_data
из client_logs
.
Обычно я делаю это с помощью PHP-скрипта или чего-то подобного.Но, к сожалению, я работаю в обстоятельствах, когда я не могу.
Мой вопрос: это выполнимо с помощью Laravel Migrations, и если да, то как?
РЕДАКТИРОВАТЬ :
Хотя я не уверен, так как я только взбил это на лету и не проверял это, я думаю, что SQL для достижения этого будет выглядеть примерно так:
DROP PROCEDURE IF EXISTS PROCESS_LOG_DATA;
DROP PROCEDURE IF EXISTS PROCESS_LOG_ENTRIES;
DELIMITER ;;
## Procedure for processing a specific log entry
## and moving its data to the new table.
CREATE PROCEDURE PROCESS_LOG_DATA(log_id bigint, partition_size int)
BEGIN
DECLARE n INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
SELECT LENGTH(log_data)/partition_size FROM client_logs where id=log_id INTO n;
SET i=0;
WHILE i<n DO
# Move the characters to the new table.
INSERT INTO client_log_partitions
(client_log_id, partition_data)
SELECT (id, LEFT(log_data, partition_size))
FROM client_logs
WHERE id=log_id
# Shift the characters off of the log_data
UPDATE client_logs
SET log_data = SUBSTR(
log_data,
partition_size,
LENGTH(log_data) - partition_size
) where id=log_id;
# Update the number of data partitions we've processed for this log entry
SET i = i + 1;
END WHILE;
End;
;;
## Procedure for processing all log entries
## and passing each one to the PROCESS_LOG_DATA procedure.
CREATE PROCEDURE PROCESS_LOG_ENTRIES(partition_size int)
BEGIN
DECLARE n INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
SELECT COUNT(*) FROM client_logs INTO n;
SET i=0;
WHILE i<n DO
PROCESS_LOG_DATA(i, partition_size)
END WHILE;
End;
;;
DELIMIETER ;
## Process the log entries.
CALL PROCESS_LOG_ENTRIES(250000);