我正在尝试创建一个数据库迁移(MySQL)来回填所有表(大约80个表,有些表有130k+行)中的uid。要在MySQL中直接执行此操作,我可以逐表执行以下命令:
UPDATE <TABLE_NAME> SET uuid = (SELECT md5(UUID()))';
为每一行添加唯一的UUID。如果我循环遍历所有表并为每个表运行一个DB facade语句:
class BackfillUuidsIntoAllTables extends Migration
{
protected $dbName;
protected $tables;
public function __construct()
{
$this->dbName = config('database.connections.' . config('database.default') . '.database');
$this->tables = DB::select('SHOW TABLES');
}
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
foreach ($this->tables as $table) {
Schema::table($table->{'Tables_in_' . $this->dbName}, function ($table) {
$tableName = $table->getTable();
DB::statement("UPDATE $tableName SET uuid = (SELECT md5(UUID()))");
}
}
}
执行速度很快,但对整个表使用相同的uid。我是不是漏掉了什么让每一行都有唯一uid?
如果您将行唯一的id添加到md5()
调用,它应该每行生成一个不同的字符串。此外,嵌套的SELECT
似乎没有必要。
这就行了:
UPDATE
<tablename>
SET
`uuid` = MD5(CONCAT(UUID(), `id`))