我最近接手了一个项目非常脏的数据库......表“users”有一个“电话”列......问题是该列包含多个用“/”分隔的电话号码。我想将所有这些放在单独的列中(电话1,电话2,电话3等)但不知道最好的方法是什么。单独使用MySQL是否可行?我应该写一些PHP脚本吗?任何提示都将不胜感激......
麦克
答案 0 :(得分:5)
是否有可用的电话号码数量有限?如果是这样,我会为他们制作新的专栏。如果没有,我会创建一个包含用户ID的新电话号码表,并以这种方式将它们联系起来。
之后,只需查询数据,然后使用 $ phone_array = explode(“/”,$ phone_data);
然后开始将它们插回数据库。
另外,您可以使用substring_index函数进行一系列查询。
答案 1 :(得分:4)
如果您不确定每条记录所需的电话号码的数量,您可能需要一个电话号码表。您可能更容易运行php脚本来更新数据库(我假设您没有将您的电话号码清理为特定格式并且您使用INNODB):
创建电话号码表:
CREATE TABLE `user_phone` (
`userid` int(10) unsigned NOT NULL,
`phone` char(15) NOT NULL,
PRIMARY KEY (`userid`,`phone`),
CONSTRAINT `fk_user_phone_userid` FOREIGN KEY (`userid`) REFERENCES `users` (`userid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
然后编写一个php脚本来拆分现有的字段数据并在新表中创建插入。
编辑:正如我在评论中所提到的,你可以有一个向后兼容的视图,它仍然可以将电话号码连在一起,直到你可以更新所有内容:
CREATE VIEW `old_table` AS
select `u`.*, group_concat(`up`.`phone` separator '/') AS `phone`
from `user_phone` `up`
left join `users` `u` on(`up`.`userid` = `u`.`userid`)
group by `u`.`userid`
答案 2 :(得分:0)
我肯定最终会把它写成一个剧本。
我喜欢将所有电话号码完全放入新表格的想法,但如果在执行此操作时遇到性能或实施问题,请确保将字段保留为phone1,phone2等。
这两种解决方案看起来都是这样的......取决于你如何访问数据库,以及你是否需要找出所有可能的性能。
我可能最终得到类似的东西:
$query = "SELECT id, phone FROM users";
$result = $db->query($query);
while ($row = $result->fetch_assoc()) {
$phones = array();
$phones = explode('/', $row['phone']);
$i = 1;
foreach($phones as $p) {
if (strlen($p) >= 7) {
$row['phone'.$i] = $p;
$i++;
}
}
$upquery = "UPDATE users SET phone1='{$row['phone1}', phone2='{$row['phone2}', ...
WHERE id={$row['id'];";
$result = $db->query($query);
}
我进行了字符串长度测试,以防止将奇数片段保存为电话号码。在保存之前,您还可以使用一点正则表达式魔法来提升每个电话号码。
使速度更快的方法是在同一查询中运行多个更新。如果脚本超时,则可以限制每次执行所影响的用户行数,并多次运行。