【发布时间】:2012-04-12 05:01:18
【问题描述】:
我有一个名为“配置文件”的表格。该表中有一个名为“user_id”的列,我已将其名称更改为“用户名”,并将类型从 INT(11) 更改为 Varchar(255) 。但是此列的内容仍然是数字 ID。
这些 id 对应于另一个名为“users”的表。该表具有名为“user_id”和“username”的字段。对于“配置文件”表上的每一行,我需要首先检查用户名字段对于 id 的内容,并在用户表上查找以获取与该 id 相对应的用户名,然后更新配置文件表的用户名值使用正确的用户名。
个人资料表:
username | blah blah...
------------------------
1 | ...
用户表:
user_id | username
------------------------
1 | Joe
我需要将配置文件表上的用户名字段的值更新为“Joe”。
我想出了这个 php 脚本,但由于某种原因只更新了 4 条记录后它就停止工作了:
$sql = 'SELECT username FROM profiles';
$query = mysql_query($sql);
while($row = mysql_fetch_assoc($query)) {
$id = $row['username'];
$sql = 'SELECT username FROM users WHERE user_id = '. $id;
$query = mysql_query($sql);
while($row = mysql_fetch_assoc($query)) {
$sql = "UPDATE profiles SET username = '".$row['username']."' WHERE username = $id";
$query = mysql_query($sql);
if(!$query) {
echo 'error!';
}
}
}
我的脚本一开始并不是那么高效,尽管这不是什么大问题,因为表只有 50k 条记录。无论如何,直接从 mysql 执行此操作的方法是什么?
【问题讨论】:
-
我的问题是你为什么要这样做?您正在从结构良好的规范化架构转变为可能更难使用并给您带来问题的架构。
-
@liquorvicar 是的,我决定不这样做。我最初的原因是通过让 url 看起来像 mysite.com/profile?user=Bob 而不是使用 id 而不是 Bob 来根据用户名选择用户。但我没有考虑这样一个事实,即通过数字 id 与 varchar 内容进行选择会更快,id 永远不变等等。所以现在我将这样:mysite.com/profile?user=Bob&id=123,这样名称和 id 都在那里,但我只是按 id 选择并在那里使用名称是出于美观/可用性的原因。