php - 用新外键替换列值的方法?

标签 php mysql sql sql-update foreign-keys

我有一个大表(数百万行),我想用 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/

相关文章:

php - mysqli 计算具有特定值的行

mysql - 在mysql中搜索负数

javascript - 使用 Node.js 和 Tedious 插入多条记录

sql - 连接表上的最大日期问题

sql - 如何在 SQLite 中合并多个数据库文件?

php - 找不到存储过程中的错误

php - 为什么执行查询时只更新/删除表的最后一行?

PHP进程间通信监控消息队列

mysql - 如何在Views + cakephp中使用controller变量

PhP mysql插入语法错误