我有一个大表(数百万行),我想用 INT
替换 VARCHAR
列中的所有值,这将是一个外来指向包含所有 VARCHAR
值的新表的键。 VARCHAR
值是唯一的,如果这很重要的话。
目前,我可以高效地创建外部表:
INSERT INTO `messages` (`message`) SELECT `message` FROM `history`;
但是我替换 VARCHAR 列的第一个基本尝试非常低效并且每行需要几秒钟,这显然是不可行的(LIMIT
用于测试)。
$messages = $mysqli->query('SELECT `message` FROM `history` LIMIT 0,100;');
while($row = $messages->fetch_array(MYSQLI_ASSOC)) {
$msg = $row['message'];
$result2 = $mysqli->query(
'SELECT `id` FROM `messages` WHERE `message` = "'.$msg.'" LIMIT 0,1'
);
$row2 = $result2->fetch_array(MYSQLI_ASSOC);
$id = $row2['id'];
$mysqli->query(
'UPDATE `history` SET `message`="'.$id.'" WHERE `message` = "'.$msg.'"'
);
$result2->free_result();
}
感觉我应该能够完全用 SQL 来完成这个过程,而不是依赖 PHP,希望这也是一种有效的方式。
最佳答案
您可以使用 UPDATE ... JOIN
查询来让您的 RDBMS 立即完成繁重的工作,而不是使用 PHP 循环:
UPDATE history h
INNER JOIN messages m ON m.message = h.message
SET h.message = m.id
这假设表 messages
已经被填充。为了获得更好的性能,因为您声明了 message
列中的值是唯一的,您可能希望在 messages(message)
上创建一个 UNIQUE
约束。
关于php - 用新外键替换列值的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55425444/