【发布时间】:2019-10-11 20:20:27
【问题描述】:
我正在尝试在 Laravel 迁移中执行以下过程:
创建一个名为client_log_partitions 的新表。 (完成)
$table->create();
$table->bigIncrements('id')->unique();
$table->bigInteger('client_log_id');
$table->mediumText('partition_data');
$table->timestamps();
- 我已经有一个名为
client_logs的表,其数据存储在名为log_data的bigText()列中。 -
client_logs表中已存在的每一行需要每 250 KB 拆分一次(或 250,000 个字符,因为它应该是单字节编码的),然后作为分区插入到新的client_log_partitions表中,参考它所属的client_logs条目。
我知道我可以使用$table->postExecute() 来实现这一点,但我只是不知道我可以用什么来做到这一点。
将数据移至新表后,我需要从client_logs 中删除log_data 列。
通常,我会使用 PHP 脚本或类似的东西来执行此操作。但不幸的是,我是在我无法做到的情况下进行操作的。
我的问题是,这是否可以使用 Laravel 迁移,如果可以,如何实现?
编辑:
虽然我不确定,因为我只是在运行过程中完成了它并且没有对其进行测试,这就是我想象的实现这一点的 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);
【问题讨论】:
标签: php mysql laravel eloquent laravel-migrations