gpt4 book ai didi

php - Laravel 将数据从一个表移动到另一个表并删除数据来自的列?

转载 作者:行者123 更新时间:2023-11-29 07:21:12 25 4
gpt4 key购买 nike

我正在尝试在 Laravel 迁移中执行以下过程:

创建一个名为 client_log_partitions 的新表。 (完成)

$table->create();

$table->bigIncrements('id')->unique();
$table->bigInteger('client_log_id');
$table->mediumText('partition_data');

$table->timestamps();

  • 我已经有一个名为 client_logs 的表,其中数据存储在名为 log_databigText() 列中。
  • client_logs 表中已存在的每一行需要每 250 KB(或 250,000 个字符,因为它应该是单字节编码)拆分一次,然后插入到新的 client_log_partitions 表作为分区,引用它所属的 client_logs 条目。

我知道我可以使用 $table->postExecute() 来实现这一点,我只是不知道我可以用什么来做到这一点。

将数据移动到新表后,我需要从 client_logs 中删除 log_data 列。

通常,我会使用 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);

最佳答案

将您的新表迁移up方法更改为:

public function up()
{
//Create the table
Schema::create('your_table_name', function (Blueprint $table) {
$table->bigIncrements('id')->unique();
$table->bigInteger('client_log_id');
$table->mediumText('partition_data');

$table->timestamps();
});

//Copy column from last table to new table
foreach(MyOldModel::all() as $item)
{
//now you can save old data into new table old data : $item -> log_data
//other operation you want
MyNewModel::create(array('partition_data' => $item -> log_data));//you can save other columns with adding array values
}

//Drop old table column
Schema::table('client_logs', function (Blueprint $table) {
$table->dropColumn('log_data');
});
}

我认为这样 migrate:rollback 命令也应该可以工作(用于撤消您的更改)!

关于php - Laravel 将数据从一个表移动到另一个表并删除数据来自的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56306043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com